我有两个库和一个应用程序组装项目布局,我想知道如何通过其中一个库中的键引用另一个库中定义的样式。

我的解决方案布局:

  • WpfControls.dll - 包含通用的可重用控件,例如基于 WPF 的 NumericUpDown 控件以及其他基本控件和一些我希望可重用的样式。为了举例说明,我的样式键定义为 我的按钮样式.
  • SpecializedControls.dll - 保存专门针对我们的应用程序的控件,例如 WPF 中的自定义复合控件和 UserControls。这是我想参考的地方 我的按钮样式 WpfControls.dll 程序集中定义的样式。
  • 应用程序 - 此程序集使用 SpecializedControls.dll 程序集中定义的控件。

我已经看到一些示例解释了如何使用简单的单个控件库和应用程序程序集来执行此操作,但就我而言,我有两个程序集和一个应用程序。换句话说,在我的例子中,我的第二个控件库中没有 App.xaml,我可以在其中使用 MergeDictionaries 概念。我很确定如果我愿意,我可以直接在每个控件 XAML 文件中放置 MergedDictionaries 引用,以合并 WpfControls.dll 程序集中定义的所有 Generic.xaml,但我的猜测是,这会导致样式被冗余地合并到各个位置在我的 SpecializedControls 程序集中,这似乎不是最好的解决方案。更糟糕的是,这些字典也可能被合并到 Application.exe 中,这是否会在运行时使我的应用程序变得臃肿?

任何人都可以澄清以最少的程序和资源开销共享此类样式的推荐或最佳方法是什么。

更新:经过更多测试后,即使在同一个程序集中,我也无法通过其键来引用 Generic.xaml 中定义的任何资源。我对资源键如何工作的理解可能完全错误,因此我必须进行更多研究并研究 ComponentResourceKey。如果有人有任何提示或建议,请帮忙。

有帮助吗?

解决方案

WPF 中的资源查找按层次结构进行:沿着逻辑树向上,然后是应用程序资源、主题资源,最后是系统资源。

主题资源通常只能隐式访问(即使在定义它们的程序集中也是如此)。这仅与样式相关,其中 TargetType 可以用作隐式键。

要完成您想要做的事情,有两种选择:

  • 用一个 组件资源键. 。这是一个特殊的资源键,允许从其他程序集引用资源。例如,您可以在中定义画笔 Wpf控件 主题词典:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    然后你可以在中引用它 专业控制:

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • 使用 合并字典 将字典导入到应用程序资源中。您可以在 应用 程序集,当应用程序加载时,甚至是位于 专业控制 将能够使用这些资源。在这种情况下,您将遇到设计时体验问题,您可以通过在其中放置一个假的 App.xaml 来解决这个问题 专业控制, ,其中还包含对字典的引用。

希望这可以帮助,

艾利杰。

其他提示

接受的答案是正确的,我只是解释如何使用 合并字典

应用程序.xaml,

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top