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


我有一个WPF应用程序,我想使用一些静态资源。我创建了一个包含资源的资源库XAML文件。我还通过Properties面板在项目的Resources中添加了一个字符串。

我假设我可以将这些资源与绑定表达式一起使用:

{StaticResource ResourceName}

但是visual studio告诉我没有找到资源。我是否必须在我的XAML中包含某种形式的参考?我见过的例子只包括本地资源,例如:

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

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


3867
2018-05-26 09:53


起源



答案:


把它们放在App.xaml :)

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

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


9
2018-05-26 09:54



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


答案:


把它们放在App.xaml :)

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

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


9
2018-05-26 09:54



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


请查看“静态资源查找行为”一节 这里。应用程序资源字典中的任何内容(即 Application.Resources)全球可用。每当您使用给定密钥查找资源,并且密钥未在本地资源字典的层次结构中的任何位置使用时,将返回应用程序字典中的密钥。

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


2
2018-05-26 21:00



我可以理解查找行为如何工作到这个Application.Resources区域,但我如何使用在项目上设置的资源。例如。右键单击项目文件,单击属性,转到资源。我的意思是那里的资源。它们不包含在我的Application.Resources中,也不是我的资源库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


您可以创建全局资源的字典,并在app.xaml中包含其路径

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/YourProject;Component/YourXamlFile.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

现在,YourXamlFile.xaml中的所有资源都将在项目中全局显示。


2
2017-08-28 03:06





只是在这里加2美分。

我也想使用全局资源,但我使用自定义的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'。如果没有,它找不到我用作转换器的某些类型。


0
2017-07-30 09:43