如何引用在另一个库中的单独程序集中定义的WPF样式键
我有两个库和一个应用程序程序程序集项目布局,我想知道如何在另一个库中定义的库中通过它们的键引用样式 我的解决方案布局:如何引用在另一个库中的单独程序集中定义的WPF样式键,wpf,assemblies,styles,resourcedictionary,mergeddictionaries,Wpf,Assemblies,Styles,Resourcedictionary,Mergeddictionaries,我有两个库和一个应用程序程序程序集项目布局,我想知道如何在另一个库中定义的库中通过它们的键引用样式 我的解决方案布局: WpfControls.dll-包含通用的可重用控件,例如基于WPF的NumericUpDown控件,以及其他基本控件和一些我希望可重用的样式。出于示例的考虑,让我们假设这里我的样式键被定义为MyButtonStyle SpecializedControls.dll-保存应用程序专用的控件,如WPF中的自定义复合控件和用户控件。这就是我想引用WpfControls.dll程序
- WpfControls.dll-包含通用的可重用控件,例如基于WPF的NumericUpDown控件,以及其他基本控件和一些我希望可重用的样式。出于示例的考虑,让我们假设这里我的样式键被定义为MyButtonStyle
- SpecializedControls.dll-保存应用程序专用的控件,如WPF中的自定义复合控件和用户控件。这就是我想引用WpfControls.dll程序集中定义的MyButtonStyle样式的地方
- Application.exe-此程序集使用SpecializedControls.dll程序集中定义的控件
更新:经过一点测试后,我似乎很难引用Generic.xaml中通过键定义的任何资源,即使在同一程序集中也是如此。我对资源键工作原理的理解可能存在一些完全错误的地方,因此我将不得不进行更多的研究,同时也要研究组件ResourceKey。如果有任何人有任何提示或建议,请提供帮助。WPF中的资源查找工作在一个层次结构中:在逻辑树上,然后是应用程序资源、主题资源,最后是系统资源 主题资源通常只能隐式访问(即使在定义它们的程序集中)。这仅与样式相关,其中TargetType可以用作隐式键 要完成您的目标,有两种选择:
- 使用组件资源键。这是一个特殊的资源密钥,允许引用来自其他程序集的资源。例如,可以在WpfControls主题词典中定义笔刷:
<LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}"> <GradientStop Color="Red" /> <GradientStop Color="Blue" Offset="1" /> </LinearGradientBrush>
然后您可以在SpecializedControl中引用它: - 使用合并词典将词典导入应用程序资源。您可以在应用程序集中执行此操作,当应用程序加载时,即使是SpecializedControls中的控件也可以使用这些资源。在此场景中,您将遇到设计时体验问题,您可以通过在SpecializedControl中放置一个假的App.xaml来解决,该控件还将包含对字典的引用
Aelij.公认的答案是正确的,我只是解释如何使用合并词典 在App.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>
我也面临同样的问题。你能扩展第二个选项吗?我不知道它将如何工作,例如,使用MergedDictionary根据另一个程序集中声明的另一个样式声明一个样式。感谢您提供的“fake App.xaml”提示。这使得使用MergedDictionaries技术的效果完全不同。
<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>