Silverlight / WPF:DependencyProperty.AddOwner&渲染变化

时间:2011-07-15 08:29:52

标签: wpf silverlight dependency-properties render

我需要实现一个标尺,我有一个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)。

1 个答案:

答案 0 :(得分:0)

如果我理解正确你想要能够在属性中执行一些逻辑,那只是GetValue& amp; SetValue方法。问题是它们仅在您创建XAML并为这些属性指定绑定时使用。在幕后他们再也不会被召唤了,而是GetValue&使用SetValue。

这就是为什么我认为(仍然不确定我清楚地理解问题)你必须在你的控件中使用ValueChanged事件(例如)的事件处理程序,并且没有其他方法来拦截对GetValue&的调用。的SetValue。

或者您可以将PropertyChangedCallback与在更改DP后调用的DependencyProperties一起使用并将代码放在那里