如何引用另一个库中单独程序集中定义的WPF样式键

jpi*_*son 12 wpf styles assemblies resourcedictionary mergeddictionaries

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

我的解决方案布局

  • WpfControls.dll - 保存通用的可重用控件,例如基于WPF的NumericUpDown控件以及其他基本控件和一些我希望可重用的样式.为了举例说明,我的样式键在这里定义为MyButtonStyle.
  • SpecializedControls.dll - 保存专门用于我们应用程序的控件,例如WPF中的自定义复合控件和UserControl.这是我想引用WpfControls.dll程序集中定义的MyButtonStyle样式的地方.
  • Application.exe - 此程序集使用SpecializedControls.dll程序集中定义的控件.

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

任何人都可以用最少的编程和资源开销来澄清分享这些样式的推荐或最佳方法.

更新:经过一些测试后,即使在同一个程序集中,我也无法通过它的密钥引用Generic.xaml中定义的任何资源.关于我如何理解资源键的工作方式可能存在一些完全错误,所以我需要进行更多的研究以及调查ComponentResourceKey.如果有人有任何提示或建议,请帮助.

Eli*_*bel 14

WPF中的资源查找在层次结构中工作:向上逻辑树,然后是应用程序资源,主题资源,最后是系统资源.

主题资源通常只能隐式访问(即使在定义它们的程序集中).这仅适用于样式,其中TargetType可用作隐式键.

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

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

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    
    Run Code Online (Sandbox Code Playgroud)

    然后你可以在SpecializedControls中引用它:

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用MergedDictionaries将字典导入应用程序资源.您可以在Application程序集中执行此操作,并且在加载应用程序时,甚至SpecializedControls中的控件也可以使用这些资源.在这种情况下,您将遇到设计时体验的问题,您可以通过在SpecializedControls中放置一个假的App.xaml来解决,它也包含对字典的引用.

希望这可以帮助,

Aelij.

  • 我面临同样的问题.你可以延长第二个选项吗?我不知道它是如何工作的,例如,根据使用MergedDictionary在另一个程序集中声明的另一个样式声明一个Style. (4认同)