【问题标题】:Use a different DataTemplate with the same key if called from different exe如果从不同的 exe 调用,请使用具有相同键的不同 DataTemplate
【发布时间】:2017-07-28 10:44:49
【问题描述】:

wpf.dll 中,我在 ResourceDictionary XAML 中使用键 MorphControl 定义了一个 DataTemplate:

<ResourceDictionary>
       <DataTemplate x:Key="MorphControl">
        <n1:m1 />
    </DataTemplate>
</ResourceDictionary>

如果这个wpf.dll被一个exe调用(比如A.exe),那么我希望上面的FindResource("MorphControl")返回m1相关资源。

但是,wpf.dll 有可能被另一个 exe(比如 B.exe)调用,在 B.exe 中,相同的键被重新定义为使用另一个值,即在 B.exe 中,这个定义存在:

<ResourceDictionary>
       <DataTemplate x:Key="MorphControl">
        <n2:m2 />
    </DataTemplate>
</ResourceDictionary>

所以当B.exe调用时,我希望FindResource["MorphControl"]返回m2相关资源。

我想为A.exeB.exe 使用相同的wpf.dll。而且我不想将MorphControl 定义从wpf.dll 移动到A.exe——它必须保留在wpf.dll

此外,这个特定的资源键必须始终保持不变,因为在 wpf.dll 内部,我有一个我不想触碰的 DataTemplateSelector 逻辑

如何做到这一点,或者这可能吗?

【问题讨论】:

  • 这听起来很像TemplateSelector,可以调用你的WPF.dll。但是你的WPF.dll 是如何组织起来的?你必须在你的WPF.dll 中有某种机制,它需要一些参数,然后尝试将它们与可用资源匹配。
  • @XAMlMAX, TemplateSelector 使用唯一的密钥对。在这种情况下,密钥必须相同

标签: c# wpf xaml datatemplate resourcedictionary


【解决方案1】:

这是一种应该可行的非正统方式(我没有尝试过,但根据我所做的其他一些事情,它应该可行):

创建两个 ResourceDictionaries,一个用于两个单独文件中的每个 exe。 创建将继承ResourceDictionary 的类,我们称之为ExeAwareDictionary。它应该具有 ResourceDictionary 类型的私有字段/属性,并且您应该覆盖 item[object] 属性。 当调用item 属性的getter 时,您可以检查它是哪个exe(通过检查当前进程)并从适当的“内部”字典中返回具有给定键的资源。

您可能还想覆盖一些其他属性,例如 KeysValues 等。

【讨论】:

  • OP 明确声明“我有一个不想触碰的 DataTemplateSelector 逻辑”。
  • 他不必这样做。 DataTemplateSelector 将完成其工作并通过密钥从 wpf.dll 请求 DataTemplate,但它会收到不同的结果,具体取决于它正在执行的 .exe 文件。
【解决方案2】:

我找到了答案(与this answer 相同):只需先定义ResourceDictionary.MergeDictionarieswpf.dll DataTemplate,然后是B.exe DataTemplate。换句话说:

<Application.Resources>
   <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                  <ResourceDictionary Source="wpf.dll.xaml"/>
                  <ResourceDictionary Source="B.exe.xaml"/>
            </ResourceDictionary.MergedDictionaries>
   </ResourceDictionary>
</Application.Resources>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多