自定义控件中FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender使用疑问
WPF依赖属性SubPropertiesDoNotAffectRender标记解析
什么是“子属性”?
子属性指的是依赖属性值本身是复杂对象时,该对象所包含的可绑定属性。举个例子:你用到的Background属性类型是Brush,而Brush的子类(比如SolidColorBrush)有Color属性,LinearGradientBrush有GradientStops属性——这些Color、GradientStops就是Brush的子属性。
WPF默认会监听这类子属性的变化,一旦子属性修改,就会触发持有该依赖属性的元素重新渲染。但有时候这种默认行为是多余的,这就需要用到SubPropertiesDoNotAffectRender标记。
绑定到Grid的Background时是否需要此标记?
需要,而且很有必要。
你的自定义窗口控件里,TitleBarBackground只是作为一个“中转”属性,把值绑定给模板内Grid的Background——也就是说,你的自定义控件本身并不直接使用这个Brush进行渲染,真正负责渲染的是Grid。
如果不加SubPropertiesDoNotAffectRender标记,当Brush的子属性(比如SolidColorBrush.Color)变化时,WPF会认为你的自定义控件需要重新渲染,触发不必要的渲染逻辑;加上这个标记后,WPF就会跳过对自定义控件的渲染通知,只让Grid自己处理子属性变化带来的渲染更新,避免了性能浪费。
内容的提问来源于stack exchange,提问作者user19229178
相关产品推荐
相关产品推荐

