【发布时间】:2011-07-15 08:29:51
【问题描述】:
我需要实现一个标尺,我有一个从 Control 派生的 CustomControl RangeSlider,它有几个 DependencyProperties(例如,Minimum、Maximum、LowerValue、UpperValue)。
public static readonly DependencyProperty LowerValueProperty =
DependencyProperty.Register("LowerValue",
typeof(double),
typeof(RangeSlider),
new FrameworkPropertyMetadata(0d, OnLowerValueChanged, CoerceLowerValue));
public double LowerValue
{
get { return (double)base.GetValue(LowerValueProperty); }
set { base.SetValue(LowerValueProperty, value); }
}
在 Xaml 中,Ruler 有一个子控件 Scale(源自 Canvas),它需要相同的 Properties 来绘制 Scaling。如果 LowerValue 或 UpperValue 改变,Scale 应该重新绘制。所以我加了
public static readonly DependencyProperty LowerValueProperty =
RangeSlider.LowerValueProperty.AddOwner(typeof(Scale), new FrameworkPropertyMetadata(1d));
当我移动拇指时,Scale 中应该会出现一些东西。首先我实现了 OnRender(DrawingContext) 并添加到 RangeSlider FrameworkPropertyMetadataOptions 中的 LowerValueProperty。但没关系,什么都不会发生。此外,我不想使用 OnRender(DrawingContext),因为它在 Silverlight 中不可用。
此外,我想知道为什么 RangeSlider 中的 OnLowerValueChanged-Method 会被提升,而不是 LowerValue 的设置器(至少调试器不会在那里中断)。
那么,当 RangeSlider 中的 LowerValue 发生变化(从 OnLowerValueChanged 引发除外)时,Silverlight 和 WPF 有没有办法在 Scale 中自动引发方法?
注意:以上代码是WPF-Code。在 Silverlight 中当然有一些区别,因为 Silverlight 不支持强制转换。
因为代码应该在 Silverlight 和 WPF 中运行,所以我不想使用 OnRender(DrawingContext)。
【问题讨论】:
-
Re Setters 没有触发:绑定到依赖属性是通过幕后的 SetValue()。 Setter/Getter 是您的助手(我认为 Xaml 解析器也可以使用)。
标签: wpf silverlight dependency-properties render