【问题标题】:double typed DependencyProperty not causing MeasureOverride() to be called双类型的 DependencyProperty 不会导致调用 MeasureOverride()
【发布时间】:2018-04-25 08:17:11
【问题描述】:

我正在制作一个自定义刻度条指示器,它派生自 FrameworkElement 类。我有一堆属性(以及附带的依赖属性)定义指标的外观和功能,例如OrientationRangeOrientationOrientation 类型,Rangedouble 类型。

从视图模型更改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


【解决方案1】:

如果您想确保依赖属性的值更改会强制测量传递和重新渲染,只需组合适当的 FrameworkPropertyMetadataOptions 标志:

public static readonly DependencyProperty RangeProperty = DependencyProperty.Register(
    nameof(Range),
    typeof(double), 
    typeof(DepthIndicatorTickBar), 
    new FrameworkPropertyMetadata(
        100d, 
        FrameworkPropertyMetadataOptions.AffectsMeasure |
        FrameworkPropertyMetadataOptions.AffectsRender));

【讨论】:

  • 工作就像一个魅力。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
相关资源
最近更新 更多