如何在 WPF 中使用全局资源?

18

我有一个WPF应用程序,希望使用一些静态资源。我创建了一个Resource Library XAML文件,并在其中添加了一个资源。我还通过“属性”面板将一个字符串添加到项目的资源中。

我以为我可以使用绑定表达式来使用这些资源:

{StaticResource ResourceName}

但是Visual Studio告诉我找不到资源。 我必须在我的XAML中包含某种引用吗? 我看到的示例仅包括本地资源,例如:

<Window.Resources>, <Page.Resources> etc

我不想在本地包含资源,因为我希望它们可以在应用程序的多个部分中使用。

4个回答

13

将它们放在App.xaml中 :)

每个WPF应用程序中都有一个 App.xaml(以及其相应的代码文件, App.xaml.cs或App.xaml.vb),它作为应用程序范围声明的全局文件。 您可以使用此文件在整个应用程序中声明恒定的外观和感觉。 例如,您可以为应用程序中的所有按钮声明默认的红色背景。

http://www.microsoft.com/emea/msdn/thepanel/en/articles/introduction_wpf.aspx


在我的项目中,默认情况下将其命名为Application.xaml。这是一个不错的答案,但我不能使我的ResourceLibrary中的样式全局可用吗? - Banford

5
你可以创建一个全局资源的字典,并将其路径包含在app.xaml中。
<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/YourProject;Component/YourXamlFile.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

现在,你的YourXamlFile.xaml文件中的所有资源都将在项目中全局可见。

2
请查看“静态资源查找行为”这一部分的内容,链接在此处。应用程序资源字典(即Application.Resources)中的任何内容都可以全局使用。每当您使用给定键查找资源,并且该键未在本地资源字典层次结构中使用时,将返回应用程序字典中的资源。

要在XAML中填充应用程序资源字典,请找到应用程序的XAML文件(通常为App.xaml),并添加一个Application.Resources元素。


我可以理解查找行为是如何一路到达Application.Resources区域的,但是我该如何使用在项目中设置的资源呢?例如,右键单击项目文件,点击属性,进入资源。我的意思是那里面的资源。它们不包含在我的Application.Resources中,也不包括我的Resource Library xaml文件。 - Banford
所以我使用了以下代码:<Application.Resources> <ResourceDictionary Source="Assets/Resources/Styles.xaml" /> </Application.Resources>这解决了一个问题,使我能够在外部资源字典中使用样式。但是在实际项目资源方面仍然有困难。 - Banford
抱歉,我没有注意到您正在尝试使用项目资源。项目资源和资源字典实际上是两个不同的东西。例如,如果您有一个作为项目资源的图像,您可以通过<Image x:Key="SomeKey" Source="URI_of_resource"/>将其放入资源字典中。但并非每个WPF类都有一个Source属性,可以从项目资源中加载它。 - Robert Rossney
那么我的字符串资源怎么办呢?将其放入项目资源中是不是一个坏主意?我应该直接将其放入资源字典中吗?因为我不知道如何做到这一点。Silverlight业务应用程序将使用.resx文件中的资源。而WPF中的项目资源文件也是.resx,所以我知道您可以从中使用StaticResource。只是我不知道如何做到。 - Banford
哦,如果你正在使用VS资源编辑器,请确保将资源的访问修饰符设置为Public。然后,您可以通过在XAML中使用{x:Static local:Properties.Resources.MyString}来获取它们。 - Robert Rossney

0

在这里补充我的两分钱。

我也想使用全局资源,但我使用了自定义的Application类,所以我不能把它放在App.xaml中。

我在根目录下创建了一个Resources.xaml文件,然后做了这个:

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/MyWpfClient;component/Resources.xaml", UriKind.Relative) });

但是请注意,Resource.xaml 必须将 Build Action 设置为“Page”。如果没有设置,它可能会找不到我用作转换器的某些类型。


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