【问题标题】:WPF IOException Cannot locate resourceWPF IOException 找不到资源
【发布时间】:2021-05-12 14:17:54
【问题描述】:

我有一个 WPF 应用程序。

应用在MainWindow.xaml 中运行时打开的页面,在App.xaml 文件的StartupUri 属性中设置。此页面可以正常打开。

但是,如果我尝试使用 ShowShowDialog 方法打开任何其他窗口,我会在 InitializeComponent 方法中得到一个 IOException "Cannot locate resource 'Window1.xaml'"(或任何文件的名称)。我创建的每个窗口都会发生这种情况。我在网上搜索过,但所有解决方案似乎都说“确保 App.xaml 的 StartupUri 属性是正确的”,而我的是,因此 MainWindow 打开。

知道发生了什么吗?

【问题讨论】:

  • 你在哪里写代码打开?是否在 Startupuri 中提供 Window1?
  • 打开 Window1 的代码位于 MainWindow 中按钮的单击事件处理程序中。当我在项目开始时,我决定删除该项目并重新开始。将代码复制并粘贴到新项目中,它现在可以工作了!编译器一定对某些事情感到困惑。我说有效,其实ShowDialog方法现在是打开窗口立即关闭,返回false!
  • 忘记我的第二个问题。我是个白痴吗!忘了我将可见性属性设置为隐藏。现在一切正常。不知道我原来的问题是怎么回事,如果有人知道会很有趣
  • 就我而言,我忘记写下正确且完整的视图名称!傻我!它必须像StartupUri="Views/MainWindow.xaml",我写过StartupUri="Views/MainWindow"

标签: c# wpf ioexception


【解决方案1】:

上述方法对我不起作用,但起作用的方法如下。打开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 更改为

StartupUri="Main/MainWindow.xaml"

解决了我的问题。

【讨论】:

  • 我做了同样的事情,并且在我重新启动项目并重建它之后它工作了。
  • 这也解决了我的问题。我忘记了我将 MainWindow.xaml 移到了 Views 文件夹中。
  • 哈,不小心输入了点而不是像 StartupUri="Main.MainWindow.xaml" 这样的斜线。这篇文章有帮助。
【解决方案2】:

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

【讨论】:

  • 这对我也有帮助。虽然我发誓,但我有该项目的精确副本(Beyond Compare 应用程序基本上只显示命名空间更改,并且工作正常)。
  • 事实上,如果我选择了一个不同的名称,但将它用于“程序集名称”和“默认命名空间”,它也可以工作。似乎问题实际上是特定的程序集名称,而默认命名空间无关紧要。我只能猜测它可能与我的解决方案中的其他项目有关。
【解决方案3】:

如果您打开 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 文件的 Build Action 没有设置为“Page”,那么你也会遇到这个问题。要检查这一点,您可以在解决方案资源管理器中选择文件并按 F4。

最后,如果在构建过程中重命名 XAML 文件(例如混淆),那么您将再次收到该错误。

除此之外,我会尝试“清洁解决方案”和“重建解决方案”以确保重建具有 InitializeComponent 定义的文件。

【讨论】:

  • InitializeComponent 方法中的 URI 绝对正确,我必须清理和重建大约 100 次(每次尝试都会拉出更多的头发)。我认为在构建过程中一定是在重命名 XAML。我很确定 Visual Studio 只是因为创建一个新项目并复制和粘贴代码解决了它而感到困惑。感谢您的帮助
  • 你最后找到答案了吗?
  • “清洁解决方案”后跟“重建解决方案”对我有用。谢谢!
  • 我正在尝试在类库中使用 WPF 表单,因此我的代码正在执行 Uri 构造。将用于 Uri 分配的代码从 InitializeComponent 复制到我的代码为我解决了这个问题。
【解决方案4】:

我有同样的问题。我的原因是因为我在没有调整 App.xaml 的情况下移动了 MainWindow.xaml。例如,如果您将 MainWindow.xaml 移动到名为“UI”的文件夹中,则必须调整 App.xaml 中的以下行

         StartupUri="UI/Mainwindow.xaml"

【讨论】:

    【解决方案5】:
    <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 所在的受人尊敬的文件夹名称之前,并且加载完成。
    【解决方案6】:

    这个IOException 可能是由程序集名称不明确引起的。例如,我将程序集命名为 myproduct.dll,然后在 WPF 应用程序 myproduct.exe 中添加对它的引用。这为mainwindow.xaml 提供了IOException

    【讨论】:

    • 是的,这也是我的情况,但我已经预见到了。如果其中一个引用另一个不同的程序集,则用相同的名称命名两个不同的程序集是不好的。一方面,构建解决方案后只有一个 pdb 文件,这很糟糕。
    【解决方案7】:

    我的问题很简单: 我的文件的 Build Action 设置为“None”。

    如果您不将其设置为“资源”,这将是一个例外。

    【讨论】:

    • 欢迎来到SOF,请comment一行解答
    【解决方案8】:

    签入App.xaml StartupUri 标签(如果您移动了MainWindow)。

    【讨论】:

      【解决方案9】:

      此外,如果您碰巧在 app.xaml.cs 中覆盖了 OnStartup(StartupEventArgs e),您还必须从 app.xaml 中删除行 StartUri="mainwindow.xaml"。 否则,在这种情况下,您也会收到“无法找到资源 'MainWindow1.xaml'”。

      【讨论】:

        【解决方案10】:

        即使我遇到了同样的问题,首先我继续挖掘问题仍然指向InitializeComponent(); 我终于发现我更新了Resources.resx 文件内容,但在我的应用程序文件夹中我没有​​更新它。 于是后来复制了新的resx文件试了一下。现在它工作正常。

        万一遇到这个问题的人请看一下。

        【讨论】:

          【解决方案11】:

          要解决此问题,请转到 App.Xaml 并更改您要在应用程序运行时运行的 StsrtUpUri。

          更改启动Uri

          如果 Xaml 在任何文件夹中,您可以按如下方式添加

          StartupUri="View/MyView.xaml"

          【讨论】:

            【解决方案12】:

            如果这对任何人都有帮助,那么我在资源路径中没有任何明显的问题就面临这个问题。一件事是我在 WPF 控件库中使用它,然后由主应用程序程序集引用。

            我只是将我的简单 URL(即文件名)更改为 pack:// URI,因为一切都开始正常工作。像这样:

            Source="pack://application:,,,/MyLib;component/SettingsPage.xaml"
            

            代替:

            Source="SettingsPage.xaml"
            

            【讨论】:

              【解决方案13】:

              确保您没有意外移动文件MainWindow.xaml 我的不知何故被误拖到了Views - 哎呀

              【讨论】:

              • 但是即使在移动它之后它也应该可以工作。如果它移动了那么我们需要改变。
              【解决方案14】:

              找到文件app.g.cs并在记事本中编辑它,在Visual Studio中它会要求你重新加载文件,点击确定,瞧

              【讨论】:

                【解决方案15】:

                同样的问题,但还有另一个解决方案:

                对我来说,我的程序集名称和默认命名空间相同但与项目名称不同。我实际上更新了默认命名空间和程序集名称以匹配新项目名称并修复它。

                【讨论】:

                  【解决方案16】:

                  我在本地化我的应用程序后注意到了这个问题。我最终得到了一个未包含在我的安装程序脚本中的卫星资源。因此,虽然它在 Visual Studio 中工作,但单独构建安装程序会导致此问题。

                  包含卫星 dll 就可以了。

                  【讨论】:

                    【解决方案17】:

                    您可能已在全局(整个项目/解决方案等)或本地重命名您的命名空间,但您的解决方案 obj\Debug 文件夹中的某些内容(xaml 类,以 [original_xaml_file_name].g.i.cs 结尾)没有接受您的更改。下次如果您遇到这种情况,请确保选择“整个解决方案(包括外部项目)”。

                    【讨论】:

                      【解决方案18】:

                      只需转到构建,然后“重建”和“清理”

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-11-04
                        • 2018-01-23
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多