WPF将开箱即用属性设置为可继承

WPF将开箱即用属性设置为可继承,wpf,xaml,inheritance,dependency-properties,Wpf,Xaml,Inheritance,Dependency Properties,是否可以更改WPF属性的继承设置?理想情况下,我会在窗口或用户控件级别设置ToolTipService.ShowDelay,可视化树中的所有内容都将从中继承。我知道这在自定义依赖项属性中是可能的,但在默认属性中?您不能直接执行此操作,因为您使用的是附加属性。使用普通DP,您可以覆盖特定(通常是派生的)类型上的元数据,但实际上没有一个位置可以为附加的属性执行此操作,因为元数据是在所有者(ToolTipService)上声明的,但它通过引用该所有者以及它最初声明的元数据来在其他所有类型上使用 您可以

是否可以更改WPF属性的继承设置?理想情况下,我会在窗口或用户控件级别设置ToolTipService.ShowDelay,可视化树中的所有内容都将从中继承。我知道这在自定义依赖项属性中是可能的,但在默认属性中?

您不能直接执行此操作,因为您使用的是附加属性。使用普通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"

我使用了你的代码,但该属性似乎不可用。我创建了一个新的自定义控件库,创建了一个新控件和模板,然后添加了您的属性。我所做的唯一更改是使用typeof(MyWindow)来匹配我的控件。当我尝试controls:FunctionPanel.时,InitialShowDisplay不可用。忽略最后的注释,我忘记添加setter和getter。非常感谢。这是一个巨大的帮助。