WPF IOException 无法找到资源。

60

我有一个WPF应用程序。

当应用程序在App.xaml文件的StartupUri属性设置打开时,打开的页面是在MainWindow.xaml中。这个页面可以正常打开。

然而,如果我尝试使用ShowShowDialog方法打开其他窗口,我会在InitializeComponent方法中收到IOException错误,错误信息为"Cannot locate resource 'Window1.xaml'"(或者其他文件名)。每次创建窗口都会发生这种情况。我已经在网上搜索了解决方案,但所有的解决方案似乎都说“确保App.xaml的StartupUri属性正确”,而我的确实正确的,这就是为什么MainWindow能够打开。

你知道发生了什么吗?


你是在哪里编写打开代码?在Startupuri中提供了Window1吗? - Kishore Kumar
打开Window1的代码位于MainWindow中一个按钮的click事件处理程序中。由于我在项目的开始阶段,我决定删除该项目并重新开始。将代码复制并粘贴到新项目中,现在它可以工作了!编译器可能对某些东西感到困惑了。我说它可以工作,实际上ShowDialog方法现在正在打开窗口并立即关闭它,返回false! - lace.john
忘记我的第二个问题。是我自己犯傻了!我忘记了我将可见性属性设置为隐藏。现在一切都正常了。如果有人知道我原来的问题是什么,那就很有趣了。 - lace.john
http://pmichaels.net/2015/01/07/startup-uri-not-working-cannot-locate-recource-mainwindow-xaml/ - Paul Michaels
1
在我的情况下,我忘记写正确和完整的视图名称了!我真是太傻了!它应该像 StartupUri="Views/MainWindow.xaml" 这样,而我写成了 StartupUri="Views/MainWindow" - Achilles
18个回答

80

上述方法对我没用,但是下面的方法可行。打开App.xaml文件。

<Application x:Class="dotDiff2013.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
    </Application.Resources>
</Application>

接下来您需要将启动URI更改为完全限定的URI。在我的情况下,我已经将MainWindow.xaml移动到一个名为“Main”的文件夹中,因此需要将上面的URI更改为:

./Main/MainWindow.xaml
StartupUri="Main/MainWindow.xaml"

问题已解决。


我做了同样的事情,重新启动项目并重新构建后它就起作用了。 - user781700
这也解决了我的问题。我忘记了将我的MainWindow.xaml移动到Views文件夹中。 - Nicolas
哈,我不小心打成点而不是斜线了,像这样 StartupUri="Main.MainWindow.xaml"。这篇文章帮了我。 - Artfaith

14

当项目设置中的“AssemblyName”和“默认命名空间”具有相同的值时,我遇到了这个问题。将 AssemblyName 更改为其他名称可以解决此问题。


1
这也帮助了我。虽然我发誓,我有一个完全复制的项目(Beyond Compare应用程序基本上只显示命名空间更改,并且它运行良好)。 - miracle2k
事实上,如果我选择一个不同的名称,但同时用于“程序集名称”和“默认命名空间”,它也可以正常工作。看起来问题实际上在于特定的程序集名称,而默认命名空间并不重要。我只能猜测这可能与我解决方案中的其他项目有关。 - miracle2k

10

如果您打开 Window1.xaml 文件的代码后端(即 Window1.xaml.cs),您可以右键单击 InitializeComponent 方法调用,然后选择“转到定义”。将会出现以下类似的代码:

/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
    if (_contentLoaded) {
        return;
    }
    _contentLoaded = true;
    System.Uri resourceLocater = new System.Uri("/TestApp;component/mainwindow.xaml", System.UriKind.Relative);

    #line 1 "..\..\..\MainWindow.xaml"
    System.Windows.Application.LoadComponent(this, resourceLocater);

    #line default
    #line hidden
}
如果上述代码中的Uri不正确,你将会收到你得到的错误。
此外,如果XAML文件的构建操作未设置为“Page”,那么你也会遇到这个问题。要检查这一点,可以在“解决方案资源管理器”中选择该文件,然后按F4键。
最后,如果某些东西需要在构建过程中重命名XAML文件(例如混淆),那么你也会收到该错误。
除此之外,我建议尝试“清理解决方案”和“重新生成解决方案”以确保具有InitializeComponent定义的文件已被重新构建。

1
InitializeComponent 方法中的 URI 明确无误,我肯定已经清理和重建了大约 100 次(每次尝试都会拔掉更多头发)。我猜想在构建过程中可能有某些东西正在重命名 XAML。我相信 Visual Studio 只是混淆了,因为创建一个新项目并复制粘贴代码就解决了问题。感谢您的帮助。 - lace.john
你最终找到答案了吗? - nicolas
1
"清理解决方案",然后"重新生成解决方案"对我有用。谢谢! - Anders Rune Jensen
我正在尝试在一个类库中使用WPF表单,因此我的代码正在进行Uri构建。将Uri分配的代码从InitializeComponent复制到我的代码中解决了这个问题。 - Sam Hobbs

10

我遇到了相同的问题。原因是我移动了MainWindow.xaml,但没有调整App.xaml。如果你将MainWindow.xaml移动到一个叫做"UI"的文件夹中,你需要调整App.xaml中的以下行:

         StartupUri="UI/Mainwindow.xaml"

4

我的问题非常琐碎:我的文件的构建操作(Build Action)设置为 "None"。

如果不将其设置为 "Resource",则会出现该异常。


欢迎来到SOF,请用comment编写单行回答。 - Peyman Majidi
谢谢,我的情况是“嵌入式资源”,我必须将其更改为“资源”并清理解决方案。 - Axeltherabbit

3
<Application x:Class="RuleSetEditor.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="/Forms/RuleEditor.xaml">
    <Application.Resources>

    </Application.Resources>
</Application>

这是我的项目文件夹结构 /Forms/。请确保在 app.xaml 中提及此内容。


我的项目突然停止加载,并且通过上述异常进行了100次重建和清理,但都没有起作用。我检查了app.xml中的启动URI,与之前相同,但是我在我的MainWindow.xml所在的文件夹名称之前添加了“/”,然后它成功地加载了。 - Ailayna Entarria

2

这个 IOException 可能是由程序集名称模糊性引起的。例如,我将一个程序集命名为 myproduct.dll,然后在 WPF 应用程序 myproduct.exe 中添加了对它的引用。这会导致 mainwindow.xamlIOException


是的,这也是我的情况,但我早就看到了。如果其中一个引用另一个,给两个不同程序集取相同的名称是没有好处的。首先,在构建解决方案后只有一个pdb文件,这是不好的。 - Ondrej Janacek

2
如果这对任何人有帮助,我在没有明显资源路径问题的情况下遇到了这个问题。其中一个问题是我在WPF控件库中使用它,然后被主应用程序程序集引用。
我只需将我的简单URL(即文件名)更改为pack:// URI,所有东西都开始正常工作。像这样:
Source="pack://application:,,,/MyLib;component/SettingsPage.xaml"

替代方案:

Source="SettingsPage.xaml"

1
即使我也遇到了同样的问题,一开始我继续深入挖掘问题,但它仍然指向了 InitializeComponent(); 。最后我发现我更新了 Resources.resx 文件内容,但在我的应用程序文件夹中我没有更新它。所以后来我复制了新的resx文件并尝试了一下。现在它可以正常工作了。
如果有任何人遇到这个问题,请参考这个方法。

1
此外,如果您在app.xaml.cs中覆盖了OnStartup(StartupEventArgs e)方法,则还必须从app.xaml中删除StartUri="mainwindow.xaml"这一行。否则,在这种情况下,您也会收到“无法定位资源'MainWindow1.xaml'”的错误提示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接