c# - WPF/Prism : How to make a resource in my main app trickle down into a usercontrol contained in a separate assembly?

标签 c# wpf resources prism

我有以下内容:

主应用程序 - 程序集 1(包含 UserContolA) - 程序集 2(包含 UserControlB) - 等

虽然不是每个程序集都会被加载,所以

如果我尝试将资源分配给它找不到的控件(按钮、组合框等),则两个程序集都无法编译,因为我希望我的 MainApp 指示这些资源。但是,如果我在程序集中包含资源,我似乎无法覆盖它们(因为 WPF 从下到上获取资源,优先考虑最接近底部的资源)。

此外,我担心即使我确实解决了这个问题,试图以一种用户可以从不同“主题”中进行选择的方式让它变得动态,这会让它变得更加困难。

我将 Prism 包含在主题中是因为我打算将其用作我的框架,但还没有深入研究它以查看它是否以任何方式影响它或已经内置了一些东西,这将是一个 Godsave .

最佳答案

您真正要问的是将 WPF 应用程序拆分为多个程序集的最佳方法是什么。您的策略是创建可重用的控件库并让应用程序集成所有内容。到目前为止很棒。您需要解决的最后一个问题是资源。要处理这个问题,您需要添加一个 Themes\Generic.xaml 并将库中的所有资源移动到其中。然后库可以找到它需要的所有资源,应用程序可以根据需要覆盖它。

这是一篇很好的文章,讨论了与跨多个程序集的资源相关的一些问题:

还要确保设置控件程序集属性,以便搜索 Generic.xaml:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None,
    ResourceDictionaryLocation.SourceAssembly)]

编辑:

上述解决方案适用于自定义控件,不适用于 UserControl 资源。要在主应用程序可以覆盖的单独程序集中处理 UserControl 资源,您可以使用以下方法:

  • 使用 {DynamicResource ...} 并简单地将资源定义留在 UserControl 之外。

问题在于,虽然资源在运行时会被正确定位,但在设计时不会找到它,这会使您的 UserControl 很难使用。此问题有两种解决方法:

  • 结合使用 Expression Blend 及其“设计时资源”功能。只需打开一个包含无法解析的资源的项目,Blend 就会提示您在设计时使用哪些资源。
  • 使用 Visual Studio 设计您的 UserControl 并在 XAML 本身中包含设计时资源。

对于 Visual Studio,您可以将其包含在 UserControl 仅在设计时:

<UserControl.Resources>
    <ResourceDictionary Source="/YourControlLibrary;component/DesignTimeResources.xaml"/>
</UserControl.Resources>

完成设计后,只需在 XAML 中注释掉该代码即可。这很不方便,但在 Visual Studio 支持设计时资源之前,至少它可以工作。

关于c# - WPF/Prism : How to make a resource in my main app trickle down into a usercontrol contained in a separate assembly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631701/

相关文章:

c# - json 错误错误的 JSON 转义序列

c# - 无法绑定(bind) contentPresenter 的内容

c# - 在 C# 4.0 中,是否有任何方法可以使一个类的其他私有(private)成员仅可用于特定的其他类?

wpf - 在 MouseUp WPF 上选择 ListBoxItem

java - 字符串已定义但未解析?

c# - Elasticsearch 应该安装在与站点相同的服务器上吗?

c# - WPF 导航和旋转背景

wpf - 使 WPF/SL 网格在确定大小时忽略子元素

c++ - std::vector 在重新分配时无论如何调用包含对象的析构函数?

java - 我的资源未加载 - "Input stream must not be null"