【问题标题】:WPF: Application resources equivalent in DLLWPF:DLL 中等效的应用程序资源
【发布时间】:2010-12-28 14:29:29
【问题描述】:

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

我知道在常规的 WPF 应用程序中,您可以在 App.xaml 中指定应用程序资源。 DLL 项目中是否有等价物?

【问题讨论】:

  • 你只是想共享可本地化的字符串资源吗?
  • 实际上,我希望我的所有用户控件都可以访问一些样式资源。

标签: wpf c#-4.0 wpf-controls resourcedictionary


【解决方案1】:

是的,您可以像这样在 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 中寻找自加载资源。我觉得好像我缺少一些关于 ResourceDictionarys 的基本知识。也许我的问题表述有误?
【解决方案2】:

不,dll 中没有等效项,因为资源加载不是程序集 (exe) 的一部分,而是应用程序的一部分。为了加载资源,必须加载应用程序。 App 是应用程序的根元素,而不是 exe 程序集。要对 dll 中的控件执行等效操作,您可以创建一个单独的 ResourceDictionary 并将其添加到每个控件的 XAML,方法是使用 ResourceDictionary.MergedDictionaries 将其合并到 UserControl 的资源中。

【讨论】:

  • 这也是我得出的结论。遗憾的是,框架没有提供像 Assembly.Resources 集合这样的东西,它可以让您定义一个合并字典,以便在程序集中的控件之间共享资源。当然,您可以为此目的创建一个新的 ResourceDictionary,但是您需要显式地管理它的生命周期。如果在控件加载时使用 Resources.MergedDictionaries.Add(...) 添加它,则必须在控件卸载时调用 Resources.MergedDictionaries.Clear(),否则资源会泄漏。
  • 如果这家伙是对的,最好考虑另一种方法:codeproject.com/Articles/846062/…
猜你喜欢
  • 2017-12-03
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 2014-02-22
相关资源
最近更新 更多