WPF自定义控件模板中MySlider属性设置失效问题求助
问题原因与解决方案
问题根源
你在MySlider构造函数中直接赋值Minimum和Maximum的方式,会将这两个值设置为依赖属性的本地值。在WPF的依赖属性优先级体系中,本地值的优先级极高,只有强制值、动画等少数操作能覆盖它。
当直接在MainWindow中使用MySlider时,XAML里的属性设置是在构造函数执行后进行的本地值赋值,因此能覆盖构造函数的设置;但在MyCustomSlider的ControlTemplate中,模板内MySlider的属性设置时机与控件实例化的顺序交互,导致模板中的本地值无法覆盖构造函数提前设置的本地值,最终呈现构造函数里的默认范围。
解决方案
不要在构造函数中设置依赖属性的默认值,改为通过重写依赖属性元数据来定义默认值。修改MySlider的代码如下:
Public Class MySlider Inherits Slider Shared Sub New() ' 重写Minimum和Maximum的元数据,设置控件默认值 MinimumProperty.OverrideMetadata(GetType(MySlider), New FrameworkPropertyMetadata(0.0R)) MaximumProperty.OverrideMetadata(GetType(MySlider), New FrameworkPropertyMetadata(255.0R)) End Sub End Class
原理说明
通过元数据设置的默认值属于WPF依赖属性优先级中的最低层级(默认值),任何后续的本地值设置(包括XAML直接赋值、模板内的属性设置)都能轻松覆盖它。这样无论是直接使用MySlider,还是将其放入MyCustomSlider的模板中,XAML里定义的Minimum和Maximum都会正常生效。
内容的提问来源于stack exchange,提问作者Nostromo
相关产品推荐
相关产品推荐

