所以我在用户控件库中有几个DataTemplate
。这些DataTemplate
驻留在themes\generic.xaml
资源字典中,可以毫无问题地在库项目中使用。
此库项目由主桌面应用程序项目使用,但在运行时Application.Current.FindResource()
找不到库中定义的任何资源。 (我以为会这样!)
所以我继续将该资源字典合并到Application资源字典中:
<Application x:Class="Application">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/ControlsLibraryProj;component/themes/generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
瞧,瞧!它现在可以访问那些DataTemplate
。我的问题是,我做得对吗?我是否需要合并引用项目中定义的字典?不知何故,我的印象是Application.Current.FindResource()
可以访问所有已加载模块(exe和dll)中定义的所有资源。这是正确的,并且我通过合并不必要地加载它们两次吗?
答案 0 :(得分:1)
我的问题是,我做得对吗?
是
我是否需要合并引用项目中定义的字典?
是的,如果您打算在应用项目中实际使用引用项目中定义的样式。
唯一的例外是默认控件样式,即引用项目中定义的任何控件的默认样式。这些是您通常在themes/generic.xaml
中定义的,这些将应用于您在应用程序中创建的相应控件的任何实例,而无需合并themes/generic.xaml
。
答案 1 :(得分:1)
如果您自己编写了用户控件库,我建议您使用generic.xaml
为自定义控件声明资源。如果您不想或不能这样做,恕我直言,您应该使用ComponentResourceKey。
您可以找到示例here(请参阅&#34;在主题级别定义资源&#34;部分)。
因此您的资源将被声明为:
<LinearGradientBrush
x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:Painter}, ResourceId=ButtonBrush}"
StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Blue" Offset="0" />
<GradientStop Color="White" Offset=".8" />
</LinearGradientBrush>
你可以检索它
ComponentResourceKey brushKey = new ComponentResourceKey(typeof(Painter), "MyEllipseBrush");
ellipseBrush = (Brush)Application.Current.TryFindResource(brushKey);
请注意,因为:
主题级别不会出现隐式样式应用程序。假设 您希望控件上的所有标签都具有某种样式。如果 你在元素级别定义样式,你不必给予 样式是一个显式键,标签将使用该样式 自动。对于主题级别的资源而言,情况并非如此。 您必须定义一个键并在每个您想要的位置引用该样式 用它。
我希望这可以帮到你。