WPF继承的附加依赖项属性是否“昂贵”?

时间:2018-09-17 19:22:42

标签: wpf data-binding attached-properties

我有一个可运行的应用程序,可以在可缩放的画布上绘制形状和图像。我想知道将当前方法从使用全局临时设置对象更改为使用继承的附加属性的效果。

说明:工程图的某些方面(例如线宽,字体大小等)可由用户配置,但 也会受缩放级别的影响。我很快发现,仅将形状的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通过遏制继承传播这样的属性有多昂贵?

我已经调试了一些附加属性的工作方式,并且看起来当附加继承的属性发生更改时,继承上下文中的每个项目实际上都会收到有关其的通知。因此,看来这确实是非常昂贵的。我不想让缩放变得迟钝或什么。

有人有处理此类问题的经验吗?这件事值得关注吗?

1 个答案:

答案 0 :(得分:1)

这是一个非常简单的示例,说明了如何变换路径的几何图形而不是路径元素本身,从而避免了重新调整其StrokeThickness的需要:

    col1  col2   new col
0   three  blue  blue
1   four         purple
2   five    red  red

使用此MouseWheel处理程序:

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