代码之家  ›  专栏  ›  技术社区  ›  Tor Haugen

WPF UserControl在引用项目中找不到XAML资源

  •  18
  • Tor Haugen  · 技术社区  · 15 年前

    在我的WPF项目中,我在单独的库项目中保留一个用户控件。用户控件访问单独的XAML文件中的资源,如下所示:

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Resources/ViewResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <!-- Local styles here -->
        </ResourceDictionary>
    </UserControl.Resources>
    

    资源文件viewresources.xaml位于名为resources的控件库项目中的文件夹中。它具有默认的生成操作(页面)和自定义工具(msbuild:compile)。

    问题是,当我引用WPF应用程序中的控件库并使用用户控件时。在运行时,我得到以下xamlparseException:

    Set property 'System.Windows.ResourceDictionary.Source' threw an exception.
    

    …包装IOException:

    Cannot locate resource 'resources/viewresources.xaml'.
    

    我怎么修这个?我尝试将资源文件的构建操作更改为“内容”,并将其复制到输出目录(适用于文件和类似的“哑”资源)。但无济于事。另外,它在用户控件中不起作用。

    有没有更好的方法来指定路径?

    是否必须将资源文件移动到应用程序项目中(我宁愿不移动,因为它属于用户控件的域)。

    5 回复  |  直到 11 年前
        1
  •  26
  •   Tor Haugen    15 年前

    找到了。

    结果发现有更好的方法来指定路径, Pack URIs . 我将XAML更改为:

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <!-- Local styles here -->
        </ResourceDictionary>
    </UserControl.Resources>
    

    这就解决了问题。

        2
  •  24
  •   Riegardt Steyn AdrianD    11 年前

    我认为这是值得发表的,以防其他人正在同一个问题上挣扎,因为我已经花了两个多小时与语法等作斗争,结果发现解决方案非常简单,但并不那么明显: 当从另一个控件库引用打包的资源时,它在设计时似乎工作正常,甚至编译时不会出错,但在运行时由于“set property”system.windows.resourceDictionary.source“引发异常”错误而失败。结果表明,仅仅从控件库引用资源程序集是不够的, 还需要添加对主应用程序程序集中包含资源字典的程序集的引用 ,否则它似乎无法编译到应用程序中。(即启动应用程序(具有app.xaml的应用程序)->添加引用->选择具有引用资源文件的程序集)。

    希望这有帮助!

        3
  •  7
  •   AlexDev    11 年前

    在我的例子中,我将ResourceDictionary和UserControl放在同一个库中,但与主应用程序分离。对我有用的是以注释中Adam建议的格式指定程序集的名称,我必须将项目中的ResourceDictionary从 Embedded Resource Page . 我没有尝试使用pack://格式,但我认为它也可以工作。

    <ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>
    
        4
  •  1
  •   Ian    11 年前

    我也有同样的错误( IOException-找不到文件 这让我花费了一天的生命,我再也回不来了。

    既不使用简单的 /程序集名称… “也不是” 包装:/…… “语法对我很有用。

    我正确地引用了主程序集中的资源程序集。

    如上所述,当我将XAML资源文件生成操作属性更改为“资源”时,错误消失。

    但是,我在这行遇到了一个xamlparseException:

    <ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />

    (我亲手打的)。

    这使得我试图包含的XAML资源文件实际上是一个无效的依赖项。

    奇怪地 修复方法是删除我键入的ImageSource属性,重新插入它,但从结果显示的下拉菜单中选择图像。

    即使结果行看起来完全相同,但显然不是。

    开始不喜欢wpf(vs2013),但希望这有帮助。

    0

        5
  •  0
  •   LoBo    12 年前

    我也遇到过同样的情况,但是包URI没有帮助我,我仍然在引用(可执行)项目中得到“找不到资源…”异常。帮助我的是,在自定义控件库项目中将我的ResourceDictionary文件设置为 嵌入式资源 .