用户控件的构造函数



我有自己的WPF用户控件(例如图像+视图框 - 没关系(。此控件具有布尔依赖属性,例如 NeedToDrawRect。我想要实现的目标:当用户将此属性设置为 true(在 XAML 中(时,我需要执行一些操作 - 但只有一次。我计划在 c-tor 中执行此操作,但似乎我还无法在该阶段看到此属性值:

XAML:

<pzi:PanZoomImage Grid.Row="1" Grid.Column="0" NeedToDrawRect="True" />

用户控件构造函数:

public PanZoomImage()
{
    InitializeComponent();
    LayoutRoot.DataContext = this;
    // Here NeedToDrawRect is still false
    if (NeedToDrawRect)
           DoSmth();            
}

那么,我在哪里可以检查用户在 XAML 中设置的值。当然,我可以覆盖OnRender并每次都在那里检查,但我想使用正确的方法来做到这一点。

为依赖项属性注册一个PropertyChangedCallback

public static readonly DependencyProperty NeedToDrawRectProperty = DependencyProperty.Register(nameof(NeedToDrawRect),
    typeof(bool), typeof(PanZoomImage ), new PropertyMetadata(new PropertyChangedCallback(OnValueChanged)));
public bool NeedToDrawRect
{
    get { return (bool)GetValue(NeedToDrawRectProperty); }
    set { SetValue(NeedToDrawRectProperty, value); }
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var ctrl = (PanZoomImage)d;
    var newValue = (bool)e.NewValue;
    //...
}

每当依赖项属性设置为新值时,都会调用回调。

如果你只想做一次某事,你可以使用私有字段来跟踪之前是否调用过回调,例如:

private int n;
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    if (n++ > 0)
    {
        var ctrl = (PanZoomImage)d;
        var newValue = (bool)e.NewValue;
        //...
    }
}

您可以在创建依赖项属性时使用 PropertyChangedCallback。如果你希望它只执行一次,然后不允许用户更改它,你可以尝试在 PropertyChangedCallback 中操作它。

    public bool NeedToDrawRect
    {
        get { return (bool)GetValue(NeedToDrawRectProperty); }
        set
        {
            SetValue(NeedToDrawRectProperty, value);
        }
    }

    public static readonly DependencyProperty NeedToDrawRectProperty =
        DependencyProperty.Register("NeedToDrawRect",
            typeof(bool),
            typeof(PanZoomImage),
            new PropertyMetadata(false, OnNeedToDrawRectChanged ));
    private static void OnNeedToDrawRectChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as PanZoomImage;
        if (control!=null && (bool)e.NewValue == false && (bool)e.OldValue == true)
        {
            control.NeedToDrawRect = true; // user won't be able to set it to false again.
        }
    }

这应该有效。如果使用复选框来执行该操作,请将复选框的 IsReadOnly 属性绑定到属性 NeedToDrawRect,以便用户将其设置为 true 后,用户将无法再次更改它。您可能需要一个反向布尔转换器来执行此操作。

最新更新