【问题标题】:using a resource in a dictionary from another one使用另一个字典中的资源
【发布时间】:2014-02-13 17:18:54
【问题描述】:

我有一个解决方案,它加载一个 WPF 应用程序,该应用程序将多个资源字典作为合并的字典。其中之一包含转换器、某些集合、模板。其他包含模板和其他东西。一些字典是从其他已编译的 DLL 加载的。

我的问题是某些词典需要使用其他词典中的资源。虽然我可以参考它们,但我想避免这种情况。我想让他们以集中的方式相互访问。

有没有办法做到这一点,我错过了,或者有人可以给我指出一篇关于这个的文章吗?我在谷歌上搜索,但什么也没找到

编辑

这个解决方案运行良好,直到我尝试在绑定中使用转换器作为 DynamicResource。有什么建议吗?

<Image Margin="0" Width="20" DockPanel.Dock="Left" StretchDirection="Both"
                       Source="{Binding MessageCode, Converter={DynamicResource MessageImageConverter}, ConverterParameter=True, FallbackValue='0'}"
                       />

这是代码

【问题讨论】:

    标签: c# wpf resourcedictionary


    【解决方案1】:

    使用“{DynamicResource myresource}”而不是“{StaticResource myresource}”。

    如果您的程序集 A.exe 在其 wpf 树中有所需的字典,则引用的程序集 B.dll 的子控件将找到所需的资源。

    不过,您不会在 WPF 设计器中看到预期的结果。

    【讨论】:

    • A.exe 中的字典是否需要对 B.DLL 中的字典进行 XAML 引用?或者他们是否有可能通过使用 DynamicResource 而不是 StaticResource 来作为合并字典自行处理?
    • 资源字典无需通过 DynamicResource 相互“了解”。它们可以在完全分离的程序集中,A.exe 甚至可以没有任何 B.dll 的引用链(这意味着您正在使用反射从 B.dll 实例化控件)
    • 正确。转换器不是 DependencyProperty。它只在绑定实例化时设置一次...这意味着如果资源在实例化时没有被解析,则根本不会设置。
    • 好的。我该如何绕过它
    • 停止为转换器使用资源:) 一个技巧是让您的 IValueConverter 成为 MarkupExtension 的子类。见stackoverflow.com/questions/7445119/…
    【解决方案2】:

    也许使用依赖注入框架。 WPF 使用 Unity/Prism 作为它的默认选择框架。您可以在您的 dll 中利用相同的概念

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多