【发布时间】:2018-04-25 08:17:11
【问题描述】:
我正在制作一个自定义刻度条指示器,它派生自 FrameworkElement 类。我有一堆属性(以及附带的依赖属性)定义指标的外观和功能,例如Orientation 和 Range。 Orientation 是 Orientation 类型,Range 是 double 类型。
从视图模型更改Orientation 会导致调用MeasureOverride() 方法,从而允许我定义控件的新维度。但由于某种原因,更改 Range 属性不会(更改其他 double 类型的属性也不会)。我不知道为什么。任何人都知道这是为什么,以及如何让Range 属性也调用MeasureOverride()?
public class DepthIndicatorTickBar : FrameworkElement
{
public static readonly DependencyProperty OrientationProperty =
DependencyProperty.Register("Orientation", typeof(Orientation),
typeof(DepthIndicatorTickBar),
new FrameworkPropertyMetadata(Orientation.Horizontal,
FrameworkPropertyMetadataOptions.AffectsRender));
public static readonly DependencyProperty RangeProperty =
DependencyProperty.Register("Range", typeof(double),
typeof(DepthIndicatorTickBar),
new FrameworkPropertyMetadata((double)100,
FrameworkPropertyMetadataOptions.AffectsRender));
public Orientation Orientation
{
get { return (Orientation)GetValue(OrientationProperty); }
set { SetValue(OrientationProperty, value); }
}
public double Range
{
get { return (double)GetValue(RangeProperty); }
set { SetValue(RangeProperty, value); }
}
protected override Size MeasureOverride(Size availableSize)
{
Console.WriteLine("MeasureOverride");
// Calculating new size
return size;
}
protected override void OnRender(DrawingContext drawingContext)
{
Console.WriteLine("OnRender");
// Drawing control
}
}
【问题讨论】:
-
有AffectsMeasure为什么还要设置AffectsRender?
-
嗯.. 全部设置为 AffectsRender,所以这可能是问题的一部分。但是为什么有些依赖属性调用了 MeasureOverride() 而有些则没有呢?
-
将 RangeProperty 设置为 AffectsMeasure 会导致调用 MeasureOverride(),但现在不会调用 OnRender(),因此不会重绘控件。我怎样才能做到这两个?
标签: c# wpf dependency-properties