【发布时间】:2020-12-16 07:40:05
【问题描述】:
我希望为我的许多项目创建一个带有可重用控件的 WPF 用户控件库,以节省每次重新创建它们的时间(我发现自己正在这样做)。
所以我:
- 创建了一个 WPF 用户控件库,并创建了一个
ThemeDark.xaml文件来包含常用的颜色键和样式。 - 在同一解决方案中创建了一个单独的常规 WPF 项目,以便我可以在实际窗口中测试控件。
- 添加了对用户控件库的项目引用。
- 在
App.xaml中添加了一个ResourceDictionary.MergedDictionaries,它引用了来自其他项目的主题文件。
问题:我可以在测试项目中访问和使用主题文件中的 SolidColorBrush 键,但由于某种原因 IntelliSense 看不到 Styles(都有钥匙)。
我似乎也无法使用pack://application:,,,/ 方法在App.xaml 中引用ResourceDictionary;它只接受文件名。这最初是通过属性面板 -> 源 -> 浏览设置的,但是我尝试了几种不同的格式,但都无济于事。它似乎也没有注意到 ThemeDark.xaml 位于用户控件库项目中的 Themes/ 目录中。
那么 - 如何从 WPF 用户控件库项目中正确引用 ResourceDictionary 并能够使用所有资源(包括样式)?
DarkTheme.xaml(内部用户控件库项目):
App.xaml(内部测试项目):
导致的行为(非常奇怪 - SolidColorBrushes 可用但 Styles 不可用):
【问题讨论】:
-
如果resourcedictionary 来自另一个dll,则需要在uri 中添加pack:// 来合并它,否则将无法正常工作。根据我的经验,如果您在另一个模块中定义的应用程序资源中使用,智能感知将无法识别它们,并将继续将它们标记为未解析。对此有一个解决方案,但它涉及创建您自己的资源字典类,并有您自己的逻辑将它们加载到您的应用程序中。这样,您可以将 if(IsDesignTime) 条件添加到 app.xaml.cs 以加载它们,以便智能感知可以找到它们。
-
您需要指定来源为
Themes/ThemeDark.xaml。要跨项目使用字典,您需要使用包 URI。见this。 -
如帖子中所述,pack:// uri 不能解决问题。使用
Source="pack://application:,,,/Themes/ThemeDark.xaml"我得到“查找资源字典时出错”。 -
那是因为你没有将项目添加到uri中。