我有两个图书馆和一个应用程序组件,项目布局,我想知道我怎么能在这在其他的定义我的图书馆之一引用样式由他们的关键。
我的解决方案布局:
我见过一些例子,说明如何用简单的单一控制库和应用程序组件做到这一点,但我的情况下,我有两个组件和应用。所以在我的情况下,换句话说,我没有一个App.xaml中在我的第二控制图书馆,在那里我可以使用MergeDictionaries概念。我敢肯定,如果我想,我可以直接把MergedDictionaries参考每个控件XAML文件合并所有在WpfControls.dll组件定义Generic.xaml的,但我的猜测是,这会导致风格进行冗余合并到不同的地方在我SpecializedControls组件,它似乎并不像最好的解决办法。更糟糕的是,这些字典也可以合并成Application.exe为好,这是否开始在运行时臃肿我的应用程序?
任何人都可以澄清什么建议或与programtic和资源开销最少的分享这种风格最好的办法。
更新:经过多一点的测试看来,我无法参照由它甚至在同一个组件内的关键定义Generic.xaml任何资源。可能有一些完全错了,我如何如何理解资源键工作,所以我必须多一点研究,以及寻找到ComponentResourceKey。如果有人有任何提示或建议,请帮助。
在WPF资源查找工作中的一个层次:最高逻辑树,然后应用程序资源,主题资源和最后的系统资源。
主题资源通常可以只是隐含(甚至在组件内它们被定义)进行访问。这仅仅是样式,其中的TargetType可以作为隐含的关键意义。
为了完成你想要做什么,有两种选择:
<LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
<GradientStop Color="Red" />
<GradientStop Color="Blue" Offset="1" />
</LinearGradientBrush>
然后你就可以在SpecializedControls引用它:
<UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
希望这可以帮助,
Aelij。
接受的答案是正确的,我只是解释如何使用MergedDictionaries
在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>