簡體   English   中英

WPF繼承的附加依賴項屬性是否“昂貴”?

[英]Are WPF Inherited Attached Dependency properties “expensive”?

我有一個可以在可縮放畫布上繪制形狀和圖像的應用程序。 我想知道將當前方法從使用全局臨時設置對象更改為使用繼承的附加屬性的影響。

解釋:圖紙的某些方面(例如,線寬,字體大小等)是用戶可配置的,但受縮放級別的影響。 我很快發現,僅將形狀的StrokeThickness綁定到配置的值會引起問題。 如果用戶放大或縮小畫布,則厚度會改變。 我希望它保持不變。

因此,我選擇了一個解決方案,該解決方案將我的形狀綁定到從配置的設置和當前縮放比例派生而來的全局臨時“實時”設置集。 當用戶將畫布放大或縮小時,后面的代碼將更改這些實時設置。

private void UpdateScaledSizesAfterZoom()
{
    // Get the scale from the canvas' scale transform. 

    if (!(Scene.LayoutTransform is ScaleTransform st))
        return;

    var div = st.ScaleX > 0 ? st.ScaleX : 1; 

    // Update all live settings with the new scale.

    LiveSettings.LineWidth       = Settings.LineWidth/ div;
    LiveSettings.FontSize        = Settings.FontSize / div;

}

捆綁:

<Path StrokeThickness="{Binding Source={x:Static LiveSettings.Default}, Path=LineWidth}" Data=... blah blah blah .../>

一切都足夠好,但是將我的所有對象都綁定到全局對象的一些事情讓我很困擾。 如果可以的話,我可以留下來,但我不介意更清潔的東西。

因此,我想知道一種使用WPF屬性繼承的方法。 我可以將這樣的屬性作為繼承的附加屬性注冊到我的畫布(“ ShapeCanvas”)上。 然后,我的形狀可以綁定到“ ShapeCanvas.LineWidth”,而不必依賴於某些全局設置對象的存在。

但是我可能有很多很多的形狀。 所以我想知道這可能會如何影響性能。 WPF通過包含繼承傳播這樣的屬性有多昂貴?

我已經調試了一些附加屬性的工作方式,並且看起來當附加的繼承屬性發生更改時,字面上的繼承上下文中的每個項目都會收到有關此通知。 因此,看來這確實是非常昂貴的。 我不想讓我的縮放變得遲鈍或什么。

有沒有人有處理此類問題的經驗? 這是值得關注的事情。

這是一個非常簡單的示例,說明如何變換路徑的幾何圖形而不是路徑元素本身,從而避免了重新調整其StrokeThickness的需要:

<Window.Resources>
    <MatrixTransform x:Key="GeometryTransform"/>
</Window.Resources>
<Canvas Background="Transparent" MouseWheel="Canvas_MouseWheel">
    <Path Fill="Yellow" Stroke="Blue" StrokeThickness="3">
        <Path.Data>
            <PathGeometry Figures="M100,50 L150,100 100,150 50,100Z"
                          Transform="{StaticResource GeometryTransform}"/>
        </Path.Data>
    </Path>
</Canvas>

使用此MouseWheel處理程序:

private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
    var transform = (MatrixTransform)Resources["GeometryTransform"];
    var matrix = transform.Matrix;
    var scale = e.Delta > 0 ? 1.1 : 1 / 1.1;
    var pos = e.GetPosition((IInputElement)sender);
    matrix.ScaleAt(scale, scale, pos.X, pos.Y);
    transform.Matrix = matrix;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM