2011-07-15 48 views
0

我需要实现一个标尺,并且我有一个从Control派生的CustomControl RangeSlider,并且有几个DependencyProperties(例如Minimum,Maximum,LowerValue,UpperValue)。Silverlight/WPF:DependencyProperty.AddOwner&Render on change

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派生),它需要相同的属性来绘制缩放。如果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方法被引发,但不是LowerValue的setter(至少调试器没有在那里打破)。

那么,有没有办法让Silverlight & WPF在Scale中自动调出一个方法,当RangeSlider中的LowerValue发生变化(除了从OnLowerValueChanged上升)?

注意:上面的代码是WPF代码。在Silverlight中,当然有一些区别,因为Silverlight不支持强制。
因为代码应该在Silverlight和WPF中运行,所以我不想使用OnRender(DrawingContext)。

+0

重新二传手不点火:绑定到依赖属性是通过的SetValue()幕后。 Setter/Getter作为你的帮手(我想也可以用于Xaml解析器)。 –

回答

0

如果我理解正确,您希望能够在属性中执行一些逻辑,这只是包装GetValue & SetValue方法。问题是它们仅在创建XAML时使用,并为这些属性指定绑定。在幕后他们不再被调用,而是使用GetValue & SetValue。

这就是为什么我认为(仍然不知道我理解的问题清楚),你必须要么使用事件处理程序ValueChanged事件(例如)您的控制内,没有其他办法拦截到的GetValue &的SetValue调用。

或者你可以使用PropertyChangedCallback与移民被称为后DependencyProperties改变,把你的代码中有

+0

好吧,现在我明白了为什么setter不会被提出。但是,我仍然想知道,WPF滑块控件如何执行。我用Reflector查看了代码。 TickBar有例如MaximumProperty(AddOwner到RangeBase.MaximumProperty),还有一个OnRender-Method。我在那里再也看不到了,触发器是如何重绘TickBar的。所以,无论如何,这是可能的。 – Em1

相关问题