【问题标题】:WPF Set Out of the Box Property to InheritableWPF 将开箱即用属性设置为可继承
【发布时间】:2013-05-17 18:29:04
【问题描述】:

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

【问题讨论】:

    标签: wpf xaml inheritance dependency-properties


    【解决方案1】:

    您无法直接执行此操作,因为您使用的是附加属性。使用普通的 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) 以匹配我的控件。当我尝试控制时:FunctionPanel.,InitialShowDisplay 不可用。
    • 忽略最后一条评论,我忘了添加 setter 和 getter。谢谢!这是一个巨大的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多