繁体   English   中英

如何阻止WPF属性值继承在某些边界传播

[英]How to stop WPF Property Value Inheritance propagation at certain boundaries

我有一个附加的属性,用于指定实现WPF属性值继承的“继承”选项。 我可以看到属性值在可视树中传播。 但是,对于大型视觉树,这可能会影响性能。

因此,我希望附加属性的附加属性值继承停止在某些边界处,更具体地说,是特定类的实例。

我已经阅读了关于FrameworkElement.InheritanceBehavior的信息,控件可以将其设置为SkipAllNext之类的东西,该属性可以停止属性值继承(尽管对于所有属性),但是也会影响资源查找。 对资源查找的影响是不可取的。

在附加属性或应作为边界的类中,是否还有其他方法可以控制传播?

我想要达到的目标是: WPF容器将所有子控件都变为只读 具有值继承的解决方案可以使所有控件都基于全局开关转换为只读,这非常好。 它只是具有此处和此处提到的性能损失。

AddOwner似乎可以工作:

class BoundaryElement : FrameworkElement {
    public static readonly DependencyProperty CustomProperty =
        AttachedProperties.CustomProperty.AddOwner(typeof(BoundaryElement),
            new FrameworkPropertyMetadata() {Inherits = false});
}

我尝试通过OverrideMetadata设置Inherits = false ,但这只会影响BoundaryElement本身,并且附加的属性值继续传播到其子级。 AddOwner有效地替换了BoundaryElement处的属性,因此原始属性不存在要继承的属性。

我知道一种可能性。 这并不是您真正想要的,但是您可以使用DependencyProperty.OverrideMetadata方法来覆盖扩展控件中的DependencyPropertyPropertyMetadata

public class SomeControl : OriginalControl
{
    static SomeControl()
    {
        OriginalControl.SomeProperty.OverrideMetadata(typeof(SomeControl), 
            new FrameworkPropertyMetadata(defaultValue, 
            FrameworkPropertyMetadataOptions.OverridesInheritanceBehavior));
    }
}

除此之外,(我可能是错的,但是)我认为您将无法实现自己的目标……WPF并不是那样设计的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM