WPF: DLL中的应用程序资源相当于什么?

9

我的解决方案中有两个项目。第一个项目是一个WPF应用程序,另一个是常规的DLL项目。在DLL项目中,我有一些WPF用户控件。我希望这些控件共享一些资源,并在DLL中定义它们。

我知道在常规的WPF应用程序中,您可以在App.xaml中指定应用程序资源。在DLL项目中有相应的方法吗?


你只是想分享本地化的字符串资源吗? - Tim Lloyd
实际上,我希望所有的用户控件都能访问一些样式资源。 - bbqfrito
2个回答

6

是的,您可以像这样在DLL中创建资源XAML(确保您已经在DLL中引用了所有WPF程序集):

<!-- name of the dictionary is MyResources in MyDLL namespace -->
<ResourceDictionary x:Class="MyDLL.MyResources"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="./Controls/ButtonStyles.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

将以下内容添加到 WPF 项目中 App 类的资源中:

public App()
{
    MyDLL.MyResources externalRes = new MyDLL.MyResources();

    this.Resources.Add("MyExternalResources", externalRes);
}

我正在寻找DLL内的自加载资源。我感觉我对ResourceDictionary有些基本的东西不太了解。也许我的问题表述不够准确? - bbqfrito

3

没有等价的DLL,因为资源加载不是程序集(exe)的一部分,而是应用程序的一部分。为了加载资源,必须加载应用程序。App是应用程序的根元素,而不是exe程序集。要在DLL中为控件做相当的事情,可以创建一个单独的ResourceDictionary,并通过将其合并到UserControl的资源中,使用ResourceDictionary.MergedDictionaries将其添加到每个控件的XAML中。


1
这也是我得出的结论。遗憾的是,框架没有提供类似于Assembly.Resources集合的东西,它可以让您定义一个合并的字典,以在程序集中共享控件资源。当然,您可以为此创建新的ResourceDictionary,但是您需要显式地管理其生命周期。如果您在控件加载时使用Resources.MergedDictionaries.Add(...)添加它,则必须在控件卸载时调用Resources.MergedDictionaries.Clear(),否则资源将泄漏。 - Ed Noepel
如果这个人是对的,最好考虑另一种方法:https://www.codeproject.com/Articles/846062/WPF-User-Controls-Do-Not-Use-Merged-Dictionaries-f - Robert Jørgensgaard Engdahl

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