访问控件库中定义的资源

时间:2017-10-30 08:12:01

标签: wpf xaml resourcedictionary

所以我在用户控件库中有几个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)中定义的所有资源。这是正确的,并且我通过合并不必要地加载它们两次吗?

2 个答案:

答案 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);

请注意,因为:

  

主题级别不会出现隐式样式应用程序。假设   您希望控件上的所有标签都具有某种样式。如果   你在元素级别定义样式,你不必给予   样式是一个显式键,标签将使用该样式   自动。对于主题级别的资源而言,情况并非如此。   您必须定义一个键并在每个您想要的位置引用该样式   用它。

我希望这可以帮到你。