WPF将Box属性设置为可继承

时间:2013-05-22 15:50:09

标签: wpf xaml inheritance dependency-properties

是否可以更改WPF属性的继承设置?理想情况下,我会在Window或UserControl级别设置ToolTipService.ShowDelay,并且可视树中的所有内容都将从那里继承。我知道这可以使用自定义依赖项属性,但使用默认属性?

1 个答案:

答案 0 :(得分:0)

您无法直接执行此操作,因为您正在使用附加属性。使用普通DP,您可以覆盖特定(通常是派生)类型的元数据,但实际上并没有一个地方可以为附加属性执行此操作,因为元数据是在所有者(ToolTipService)上声明的,但它已被使用在每个其他类型上引用该所有者,以及它最初声明的元数据。

您可以通过声明自己的属性版本然后使用该属性在该值的每个继承者上设置真实属性来模拟所需的行为。这是财产声明:

    public static readonly DependencyProperty InitialShowDelayProperty = DependencyProperty.RegisterAttached(
        "InitialShowDelay",
        typeof(int),
        typeof(MyWindow),
        new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits, InitialShowDelayPropertyChanged));

    public static int GetInitialShowDelay(DependencyObject target)
    {
        return (int)target.GetValue(InitialShowDelayProperty);
    }

    public static void SetInitialShowDelay(DependencyObject target, int value)
    {
        target.SetValue(InitialShowDelayProperty, value);
    }

    private static void InitialShowDelayPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ToolTipService.SetInitialShowDelay(d, (int)e.NewValue);
    }

然后设置继承值只需设置你的新属性,它应该为所有孩子设置ToolTipService真正的属性:

local:MyWindow.InitialShowDelay="555"