【问题标题】:Resources from ResourceDictionary accessible but Styles are notResourceDictionary 中的资源可访问,但样式不可访问
【发布时间】: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中。

标签: wpf xaml


【解决方案1】:

我发现了问题。我从项目的命名空间中删除了空格,但没有从程序集名称中删除。

修复后我就可以使用Source="pack://application:,,,/MyControlLibrary;component/Themes/ThemeDark.xaml" MyControlLibrary 不是实际名称! ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2013-12-19
    • 2012-03-19
    相关资源
    最近更新 更多