我需要实现一个标尺,我有一个CustomControl RangeSlider,它派生自Control并有几个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中,标尺有一个子控件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的setter(至少调试器没有在那里中断)。
那么,Silverlight&有没有办法WPF在Scale中自动引发方法,当RangeSlider中的LowerValue发生变化时(除了从OnLowerValueChanged引发)?
注意:上面的代码是WPF代码。在Silverlight中当然有一些区别,因为Silverlight不支持Coercion等 因为代码应该在Silverlight和WPF中运行,所以我不想使用OnRender(DrawingContext)。
答案 0 :(得分:0)
如果我理解正确你想要能够在属性中执行一些逻辑,那只是GetValue& amp; SetValue方法。问题是它们仅在您创建XAML并为这些属性指定绑定时使用。在幕后他们再也不会被召唤了,而是GetValue&使用SetValue。
这就是为什么我认为(仍然不确定我清楚地理解问题)你必须在你的控件中使用ValueChanged
事件(例如)的事件处理程序,并且没有其他方法来拦截对GetValue&的调用。的SetValue。
或者您可以将PropertyChangedCallback
与在更改DP后调用的DependencyProperties一起使用并将代码放在那里