2011-06-29 305 views
37

我有一个WPF应用程序。WPF IOException找不到资源

应用程序在MainWindow.xaml中运行时打开的页面,如App.xaml文件的StartupUri属性中设置的那样。此页面打开正常。但是,如果我尝试使用Show或ShowDialog方法打开任何其他窗口,则会在InitializeComponent方法中出现“找不到资源Window1.xaml”(或任何文件被调用)的IOException异常。这发生在我创建的每个窗口中。我在网上搜索,但所有的解决方案似乎都说“确保App.xaml的StartupUri属性是正确的”,我的是,因此MainWindow开放。

任何想法是怎么回事?

+0

你在哪写代码打开?在Startupuri中提供Window1? –

+0

打开Window1的代码位于MainWindow中按钮的单击事件处理程序中。当我在项目开始时,我决定删除该项目并重新开始。将代码复制并粘贴到新项目中,现在它正在工作!编译器一定会对某件事感到困惑。我说它有效,实际上ShowDialog方法现在打开窗口并立即关闭它,返回false! –

+0

忘记我的第二个问题。我是一个白痴!忘了我将隐藏的可见性属性设置为隐藏。现在一切正在运转。不知道我原来的问题是怎么回事,如果有人知道会发现 –

回答

39

上面没有为我工作,但做了什么工作如下。开拓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更改为完全合格的。在我来说,我搬到我MainWindow.xaml一个叫“主”文件夹,所以改变上述URI来

StartupUri="Main/MainWindow.xaml" 

解决了我的问题。

+0

我做了同样的事情,并且在我重新启动项目并重建它之后工作。 – user781700

7

如果您打开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 
} 

如果上述开放的代码是不正确的,那么你会得到你明白我的错误。

另外,如果XAML文件的Build Action没有设置为“Page”,那么你也会遇到这个问题。要检查这一点,您可以在解决方案资源管理器中选择该文件并按F4键。

最后,如果某些事情正在将XAML文件重命名为构建过程的一部分(例如模糊处理),那么您将再次收到该错误。

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

+1

InitializeComponent方法中的URI绝对是正确的,我必须清理并重建约100次每次尝试都拉出更多的头发)。我假设在构建过程中必须重命名XAML。我非常确定Visual Studio只是因为创建一个新项目而感到困惑,并且复制并粘贴代码解决了它。感谢您的帮助 –

+0

您是否最终找到答案? – nicolas

+0

“清洁解决方案”,然后是“重建解决方案”为我工作。谢谢! –

2

这个IOException可能是由程序集名不明确造成的。例如,我命名了程序集myproduct.dll,然后在WPF应用程序myproduct.exe中添加了对它的引用。这给了IOExceptionmainwindow.xaml

+0

是的,这也是我的情况,但我看到它来了。如果其中一个引用另一个,则命名两个具有相同名称的不同程序集是不好的。首先,构建解决方案后只有一个pdb文件,这很糟糕。 –

12

当项目设置中的“AssemblyName”和“Default Namespace”具有相同的值时,我遇到了这个问题。将AssemblyName更改为别的方法解决了问题。

+0

这对我也有帮助。虽然我发誓,我有一个项目的确切副本(超越比较应用程序本质上只显示名称空间更改,并且它工作正常)。 – miracle2k

+0

事实上,如果我选择了一个不同的名称,但将它用于“程序集名称”和“默认名称空间”,它也可以工作。看来问题实际上是特定的Assembly名称,而Default命名空间并不重要。我只能猜测它可能与我的解决方案中的其他项目有关。 – miracle2k

+0

由于一些奇怪的原因,这也适用于我。 – hattenn

1

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

0

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

0

确保您没有意外移动文件MainWindow.xaml 矿不知怎的被误拖入Views - oops

0

检入App.xamlStartupUri标记(如果您移动了MainWindow)。

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> 

here/Forms /是我的项目中的文件夹结构。确保这是在app.xaml提到

+0

我的项目突然停止加载,并通过上面提到的异常做了重建和清理100次没有工作,检查app.xml中的启动uri和以前一样,但是我已经在我尊重的文件夹之前添加了“/”名称,我的MainWindow.xml位于哪里,并且在加载完成之后。 –

9

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

  StartupUri="UI/Mainwindow.xaml" 
+0

为我工作感谢! –

+0

为我工作感谢 –

0

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

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

0

我在本地化我的应用程序后发现了这个问题。我结束了一个卫星资源,我没有包含在我的安装程序脚本中。所以,虽然它在Visual Studio中工作,但单独构建安装程序会导致此问题。

包括卫星dll的窍门。

1

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

只要有人遇到这个问题来看看这一次。