【问题标题】:Silverlight /WPF: DependencyProperty.AddOwner & Render on changeSilverlight /WPF: DependencyProperty.AddOwner & Render on change
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 好的,现在我明白为什么不提出 setter 了。但后来我仍然想知道,WPF 滑块控件是如何执行的。我用 Reflector 查看了代码。 TickBar 有例如MaximumProperty(AddOwner 到 RangeBase.MaximumProperty)并且还有一个 OnRender-Method。我不再在那里看到如何触发重新绘制 TickBar。所以,无论如何都是可能的。
猜你喜欢
  • 2021-02-01
  • 2023-02-09
  • 2016-11-17
  • 1970-01-01
  • 2019-10-14
  • 2014-01-16
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多