【问题标题】:Accessing resources defined in Controls Library访问控件库中定义的资源
【发布时间】:2017-10-30 08:12:00
【问题描述】:

所以我在用户控件库中有几个DataTemplates。这些DataTemplates 驻留在themes\generic.xaml 资源字典中,可以毫无问题地在库项目中使用。

此库项目由主桌面应用程序项目使用,但在运行时Application.Current.FindResource() 无法找到库中定义的任何资源。 (我以为会的!)

所以我继续将该资源字典合并到应用程序资源字典中:

<Application x:Class="Application">
  <Application.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/ControlsLibraryProj;component/themes/generic.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </Application.Resources>
</Application>

瞧!它现在可以访问那些DataTemplates。我的问题是,我做对了吗?我是否需要合并在引用项目中定义的字典?不知何故,我的印象是Application.Current.FindResource() 可以访问所有已加载模块(exe 和 dll)中定义的所有资源。这是正确的吗?我是否通过合并不必要地加载了两次?

【问题讨论】:

  • 用户控件库是第三方组件还是您自己的组件?
  • @IlVic:这是我自己的库,可作为解决方案中的项目使用。

标签: wpf xaml resourcedictionary


【解决方案1】:

我的问题是,我做对了吗?

是的。

是否需要合并引用项目中定义的字典?

是的,如果您打算在您的应用项目中实际使用引用项目中定义的样式。

唯一的例外是默认控件样式,即在引用项目中定义的任何控件的默认样式。这些是您通常在 themes/generic.xaml 中定义的那些,它们将应用于您在应用程序中创建的相应控件的任何实例,而无需合并 themes/generic.xaml

【讨论】:

  • 谢谢。这是有道理的。
【解决方案2】:

如果您自己编写用户控件库,我更建议您使用generic.xaml 为您的自定义控件声明资源。如果您不想或不能这样做,恕我直言,您应该使用ComponentResourceKey

您可以找到一个示例here(查看“在主题级别定义资源”部分)。

所以你的资源将被声明为:

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

请注意,因为:

隐式样式应用不会发生在主题级别。认为 您希望控件上的所有标签都具有某种样式。如果 您在元素级别定义样式,您不必给出 样式是一个显式键,标签将使用该样式 自动地。主题级别的资源并非如此。 您必须定义一个键并引用您想要的每个地方的样式 使用它。

希望对你有帮助。

【讨论】:

  • 非常感谢。这当然是一种有趣的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多