【问题标题】:WPF Resource Dictionary using code behind file can’t be found找不到使用代码隐藏文件的 WPF 资源字典
【发布时间】:2013-10-15 09:34:54
【问题描述】:

当我使用以下包语法包含一个包含 ResourceDictionary 的程序集时:

"pack://application:,,,/WpfCore;component/ResourceDictionaries/ThemedControls.xaml"

它按预期工作,但只要我将代码隐藏文件添加到 ResourceDictionary 的 XAML,就会引发以下错误: “查找资源字典时出错”

后面的代码以通常的方式添加到 XAML 中:

< ResourceDictionary x:Class="com.mycompany.WpfCore.ResourceDictionaries.ThemedControls"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
</ResourceDictionary>

看起来像这样:

namespace com.mycompany.WpfCore.ResourceDictionaries
{
    public partial class ThemedControls : ResourceDictionary
    {
        public ThemedControls ()
        {
            InitializeComponent();
        }
    }
}

直觉告诉我这是一个命名空间问题,但我尝试过的所有变体都失败了。我在做什么错还是这是 WPF ResourceDictionaries 的限制?

编辑

似乎问题的详细信息被调出并被发现缺乏。

最初的示例简化了命名空间。 WpfCore 项目的默认命名空间是 com.mycompany.WpfCore,我现在已将其添加到上面的代码示例中。

ThemedControls.xaml 和 ThemedControls.xaml.cs 文件位于 WpfCore 项目文件夹中名为 ResourceDictionaries 的子文件夹中。 生成的程序集用作另一个解决方案中的引用程序集,这就是使用 Pack URI 的地方。

编辑 2

在玩弄了 xaml 文件的构建操作(从页面更改为资源并再次返回)之后,事情开始起作用了。将 Sheridan 的答案标记为正确。

【问题讨论】:

  • 为什么要向 ResourceDictionary 添加代码隐藏文件?
  • 后面的代码根据运行时系统信息合并额外的字典,即不同操作系统的不同资源字典。

标签: c# wpf resourcedictionary


【解决方案1】:

我认为您没有完全正确地声明您的ResourceDictionary...应用程序名称确实应该在命名空间中。这应该工作......至少它对我有用:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Class="WpfCore.ResourceDictionaries.ThemedControls">
</ResourceDictionary>

后面的代码:

namespace WpfCore.ResourceDictionaries
{
    public partial class ThemedControls : ResourceDictionary
    {
        public ThemedControls()
        {
            InitializeComponent();
        }
    }
}

【讨论】:

  • 似乎这将在同一个解决方案中工作,这不完全是我的做法。这个问题可能有点含糊,并且已经更新了有关将程序​​集用作引用程序集的更多详细信息。
  • 啊,抱歉,我还没有遇到过这种情况,所以我无能为力了。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2012-05-30
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多