在WPF中定义可重用资源的良好实践

3

我一直在使用.Net编写一个类似于CAD的程序,因此我需要有许多画刷(Brushes)和自定义虚线样式(Custom DashStyles)。

到目前为止,我已经在一个静态类中定义了它们。例如:

public static readonly Brush GridBrushInModel = Brushes.DarkGray;

现在我可以随时使用刷子。虽然我也冻结了它们。

我的问题是,这样做是正确的方式吗?还是有更好的方法?比如在ResourceDictionary中定义?具体怎么做呢?

1个回答

4

在WPF应用程序中,共享资源通常作为ResourceDictionary存储。每个字典都应该有自己的XAML文件(如果您想分割资源)。

这些资源的定义非常简单:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <SolidColorBrush x:Key="MyCoolBrush" Color="Black"/>

</ResourceDictionary>

请注意,我给元素添加了一个 x:Key 属性。这是您稍后用来引用资源的属性。
最后,您需要将字典与使用代码进行合并。这可以在任何级别上完成,尽管最常见的是在 Window.ResourcesApp.xaml 中完成。
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/MyBrushes.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        ...
    </ResourceDictionary>
</Window.Resources>

你可以使用以下方式在XAML中引用它们:

一旦你拥有它们,你可以像这样在XAML中引用它们:

<Grid Background={StaticResource MyCoolBrush}/>

1
@Vahid 的理论是,每次拥有该控件的实例时(也就是说,它可能会改变),您希望能够为控件指定一个特定的画笔。因此,良好的设计规定您要做正是您所描述的事情。在您的情况下,您保证每次使用相同的资源,因此可以直接访问“资源”字典。但这样做以后不太灵活。 - BradleyDotNET
我知道我已经编写了一个完全可用的软件,但我感觉自己对面向对象编程一无所知。 - Vahid
@Vahid 你会成功的。通常的建议是“第一个项目先扔掉”,这句话有它的道理(虽然很少有人真正做到了,但大多数人都应该这么做)。我曾经有一次得到这个机会,我的第二次尝试要好得多。 - BradleyDotNET
@Vahid 实际情况意味着你几乎从来没有机会把第一个扔掉 :). 在我的情况下,由于平台/语言/范围的变化,我不得不完全重写系统。通过编写第一个系统,我已经发现了所有的“陷阱”,因此我能够在第二个系统中考虑到它们,而不破坏设计。这是一个非常罕见的情况,但也是非常愉快的! - BradleyDotNET
我完全理解你的意思,这种情况也曾经发生在我身上,但是发生的规模要小很多。 - Vahid
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接