簡體   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