wpf 在UserControl库中使用全局ResourceDictionary,而不在UserControl中引用它

p5fdfcr1  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(146)

我创建了一个包含多个UserControl的WPF类库项目。我的目的是建立通用的样式、模板和资源,库中的所有UserControl都可以使用和引用。
我试图在程序集级别定义一个ResourceDictionary,特别是在Themes/Generic. xaml中。但是,当试图在UserControls中使用以这种方式定义的资源时,似乎无法找到它们。
例如,在Themes/Generic.xaml中:

<ResourceDictionary 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <SolidColorBrush x:Key="TextColorBrush" Color="Blue"/>
</ResourceDictionary>

然后在其中一个UserControls中:

<UserControl
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">

  <TextBlock Text="Hello" Foreground="{StaticResource TextColorBrush}"/>

</UserControl>

这将导致编译时错误,因为如果没有对全局资源字典的显式引用,则无法解析资源。
是否有一种方法可以定义全局资源,使它们在整个程序集/项目中隐式可用,而无需在每个UserControl中包括ResourceDictionary?
理想情况下,我不希望每个控件都必须包含:

<UserControl.Resources>
  <ResourceDictionary Source="Themes/Generic.xaml"/>
</UserControl.Resources>

任何建议将不胜感激!

c8ib6hqw

c8ib6hqw1#

您可以将资源放在app.xaml文件中:

<Application.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
                 <!-- Merged dictionaries -->
            </ResourceDictionary.MergedDictionaries>
            <!-- Other resources -->
          </ResourceDictionary>
    </Application.Resources>

这将使资源可用于同一应用程序中的所有控件。
如果你正在编写一个库,你可以把所有的资源放在一个公共资源字典中,然后把它包含在你编写的每个控件中。您仍然需要包含它,但至少包含的代码相当少。
但我不知道在编写库时处理样式的最佳方法是什么。我希望它,如果应用程序有一些很好的方式来覆盖样式,如果它想偏离默认值。我还没能找到任何关于在编写库时如何最好地管理样式和其他资源的明确指导。

相关问题