The name 'InitializeComponent' does not exist in the current context
如果我在Visual Studio 2010 SP1中创建一个新项目,并选择"WPF应用程序",并尝试构建生成的应用程序,我会得到错误信息。
The name 'InitializeComponent' does not exist in the current context.
今天早上,当我试图构建我当前的项目时,也遇到了类似的错误。昨天,我编译和运行它没有问题。
我创建了一个新项目,每次编译该项目时都会出错。我刚把这个项目发给了一位同事,他编译的时候没有任何错误。
怎么了?
我已经遇到过几次了,一直忘了是什么引起的。当我在代码隐藏文件中而不是在XAML中重命名命名空间时,遇到了这个问题。
所以检查一下你是否做过同样的事情。
命名空间和类名需要匹配,因为它们都是分部类的一部分
1 2 3 4 5 6 7 8 9 10 11 12 13 | namespace ZZZ { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow { //... } } <!-- XAML --> <Window x:Class="ZZZ.MainWindow"> |
在项目之间移动XAML文件时,.xaml文件的生成操作也必须设置为"页",此设置将丢失(至少在vs 2010中)。
对于那些(在VS2015中)在调试模式下没有错误,但在发布模式下有指定错误(但项目运行良好)的人,下面是一些简单的尝试:
这种方法对我很管用。
有一个非常具体的原因,它在项目设置中。每当您试图将WPF控件/窗口添加到.NET 2.0类库或项目时,通常会发生这种情况。此错误的原因是项目不知道它正在构建WPF控件或窗口,因此尝试将其构建为C 2.0项目。
解决方案包括编辑.csproj文件。右键单击导致问题的项目,然后选择"卸载项目"。右键单击卸载的项目并选择"edit.csproj"。.csproj文件将打开,您可以看到XML。查找以下行:
1 | <Import Project=….. |
它在文件的末尾,你只有一行可能
1 | <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> |
这将告诉Visual Studio将项目构建为.NET 2.0项目。我们要做的是告诉Visual Studio这实际上是一个WPF项目,因此我们必须添加以下行:
1 | <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" /> |
这一行将告诉Visual Studio将项目构建为WPF项目。现在,您的.csproj文件底部应该如下所示:
1 2 | <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" /> |
保存.csproj文件,在解决方案资源管理器中右键单击它,然后选择"重新加载项目"编译,就这样,一切都完成了!
当我意外地从XAML定义中删除类引用时,发生了这种情况:
我已经换了
1 2 3 | <Window x:Class="myapp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
第一行:
1 2 3 | <RibbonWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
我知道这不是原始问题的答案(因为Project是在另一台机器上构建的),但是错误消息是相同的,所以我可能会帮助其他人处理这种情况。
在重构过程中遇到了这个错误,我重命名了一些文件/文件夹,并且需要重新生成预先存在的*.g.cs文件。
确保在XAML文件中
1 | <Page x:Class="Project1.Page1" ... |
匹配"project1"名称和"page1"名称
从其他项目导入类、更改XAML文件的路径或XAML或.cs文件后面的命名空间时,可能会出现此错误。
一:它的名称空间可能与新项目中的名称空间不同。
1 2 3 4 5 6 7 8 9 10 | namespace TrainerB.MVC.Forms { public partial class AboutDeveloper : ContentPage { public AboutDeveloper() { InitializeComponent(); } } } |
正如您可以看到的,导入文件中的名称空间以旧项目名称"trainerb"开头,但新项目可能具有不同的名称,因此只需在.xaml文件和behind.cs文件中将其更改为正确的新项目名称即可。
二:
将.xaml文件的属性更改为:
生成操作:嵌入的资源
自定义工具:msbuild:updateDesignTimeXaml
重命名用户控件时遇到此问题。我修复它的方法是注释掉InitializeComponent,验证所有名称是否正确(XAML和代码隐藏),生成项目,取消对InitializeComponent的注释,然后重新生成。听起来这个问题可能有几个原因/解决方案,但我就是这样做的。
我遇到过这种情况(尽管这是我的错,是在我复制和粘贴了一些代码之后造成的);当命名空间在XAML和后面的代码之间不匹配时,就会发生这种情况。
如
1 | <UserControl x:Class="DockPanel.TreeView" /> |
后面的代码是
1 | namespace NotDockPanel |
以上所有的答案对我都不起作用。除了复制品,我都试过了。然而,由于一些奇怪的原因,这在我的Visual Studio 2015跨平台项目中起到了作用:
我同意上面的答案,即名称空间必须匹配。但是,在名称空间匹配的地方,我遇到了这样的问题。
为了解决这个问题,我简单地将XAML中的名称空间更改为一个不正确的名称空间,然后保存,然后将其更改回正确的名称空间。哇!
卸载整个解决方案,然后重新加载。然后重新构建解决方案。这解决了我的问题。
如果您使用的是Xamarin表单,并且您移动了一个Xaml文件,那么该文件的"构建操作"将被更改。Xamarin表单需要"build action=embedded resource"。
在Visual Studio中应用"生成操作":
此错误的另一个常见原因是,如果您在其中执行了以下操作:
右键单击Project中的文件夹以创建新的用户控件。这将创建从文件夹命名空间中的用户控件派生的类和XAML文件。
然后您决定更改类的名称空间,因为您实际上只是使用文件夹来组织代码。x:class属性不会自动更新,因此它将搜索不存在的类。可能会使用更好的错误消息,如"在namesace bla.bla a.blaaa中找不到x:Class类型"。
我尝试以上所有建议。如果你也尝试过而没有成功,那就找到更简单的方法。创建一个新的page.xaml,然后复制新类的代码并删除有问题的类xaml。不要多花时间。
检查设计器文件。
我也有同样的问题。在我的例子中,原因是filename.designer.cs的
将filename.designer.cs的EDOCX1[0]更改为与filename.cs的EDOCX1[0]匹配,立即解决了问题。
这个问题的另一个解决方案是简单地将XAML上的属性->构建操作从嵌入资源更改为其他任何内容,保存,然后立即将其更改回嵌入资源。错误消失了。
如果名称空间正确,那么也会有相同的错误,
只需关闭应用程序并再次打开它。
这可以解决你的问题
这帮我解决了问题。
我已经将app.xaml文件中的资源注释掉了
1 2 3 4 5 6 7 8 9 10 11 | <Application x:Class="MyApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> <!--<ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>--> </Application.Resources> </Application> |
重新注释this以修复生成错误。
1 2 3 4 5 6 7 8 9 10 11 | <Application x:Class="MyApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application> |
再深入一点,我发现project objdebug中的app.g.cs文件只在我离开注释的资源时包含以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /// <summary> /// InitializeComponent /// </summary> [System.Diagnostics.DebuggerNonUserCodeAttribute()] public void InitializeComponent() { if (_contentLoaded) { return; } _contentLoaded = true; System.Uri resourceLocater = new System.Uri("/MyApp;component/app.xaml", System.UriKind.Relative); #line 1"..\..\..\App.xaml" System.Windows.Application.LoadComponent(this, resourceLocater); #line default #line hidden } |
这对我来说是因为nuget包卸载程序破坏了app.xaml中
我通过将app.xaml还原为受源代码管理的副本来解决此问题。
我发现"启动对象"是(未设置)导致此错误的原因。
"启动对象"(未设置)
我知道这是因为另一个原因,但这是一个非常热门的帖子,我在一个类库遇到了同样的问题。在这种情况下,结果是我的命名空间发生了变化(在本文中回答),并且编译器无法重建定义initializecomponent()方法的window.g.i.cs。不能,因为类库在csproj文件中缺少wpf项目的projecttypeguid值。有关这方面的说明在这里和这里。我想我会分享,以防其他人遇到同样的问题。在这种情况下,仅仅更改名称空间是不够的。
由于这似乎是有关缺少"initializecomponent"的问题的转到线程,我将在此处包含我的答案。
我也有这个问题,我已经尝试了我在这里和谷歌能找到的所有其他论坛中找到的一切,但是没有人能帮我解决这个问题。经过两个小时的尝试,我终于发现我的设置出了什么问题。
在我们的项目中,我们使用的是Mahapps的地铁组件。给我带来麻烦的观点是从Metrowindow继承的观点,如下:
1 2 3 | <Controls:MetroWindow x:Class="ProjectNamespace.MyView" xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls" ... > |
现在,我将静态资源定义为
1 2 3 4 | <Controls:MetroWindow.Resources> <prop:Resources x:Key="LocalizedStrings"/> ... </Controls:MetroWindow.Resources> |
这就是我在所有其他视图中定义
不过,这不是江户十一〔一〕的情况!在这里,我绝对需要如下的资源定义:
1 2 3 4 5 6 | <Controls:MetroWindow.Resources> <ResourceDictionary> <prop:Resources x:Key="LocalizedStrings"/> ... </ResourceDictionary> </Controls:MetroWindow.Resources> |
总之,我的问题是缺少
执行某些操作后,.cs文件的命名空间和.xaml文件中的命名空间可能不同(在xaml中,请查找x:class="namespace.yourtype")。
把它们修好。
对于那些在网上找到这个的人。如果存在编译,请检查windows.csproj文件。应该有2个条目
1 2 3 4 5 6 7 8 | <Page Include="YourFile.xaml"> <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> <Compile Include="YourFile.xaml.cs"> <DependentUpon>YourFile.xaml</DependentUpon> </Compile> |
在这个线程中,对MCVE最好的一点是,使用VS2017 15.5.2,加载LabelControlAdvancedSample的XAML,这是本教程页面中的最后一个示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <Window x:Class="WpfTutorialSamples.Basic_controls.LabelControlAdvancedSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="LabelControlAdvancedSample" Height="180" Width="250"> <StackPanel Margin="10"> <Label Target="{Binding ElementName=txtName}"> <StackPanel Orientation="Horizontal"> <Image Source="http://cdn1.iconfinder.com/data/icons/fatcow/16/bullet_green.png" /> <AccessText Text="_Name:" /> </StackPanel> </Label> <TextBox Name="txtName" /> <Label Target="{Binding ElementName=txtMail}"> <StackPanel Orientation="Horizontal"> <Image Source="http://cdn1.iconfinder.com/data/icons/fatcow/16/bullet_blue.png" /> <AccessText Text="_Mail:" /> </StackPanel> </Label> <TextBox Name="txtMail" /> </StackPanel> |
将app.xaml&app.xaml.cs保留为默认值后,尝试编译上述内容会产生链接器错误。幸运的是,将鼠标悬停在labelControlAdvancedSample.xaml.cs中的initializecomponent()语句上时,会出现一个链接的文本提示:
Show potential fixes.
单击它会调用另一个链接文本:
Generate method MainWindow.InitializeComponent.
这样做会产生以下"什么都不做"方法:
1 2 3 4 | private void InitializeComponent() { throw new NotImplementedException(); } |
必须为要生成的项目定义函数。在wpf到vb.net中,initializecomponent的实现似乎有所不同。编辑:XAML第一行中的namespace.class不正确。根据msdn和@sean b的答案,应该是
1 | <Window x:Class="LabelControlAdvancedSample.MainWindow" |
因此,项目编译没有错误,不需要伪初始化组件方法,实际上它会产生更多的错误。去显示VS是有帮助的,即使在极少数的用户错误的情况下。P
当我创建一个"WPF应用程序项目",然后将其构建目标更改为"类库"以供其他程序用作外部工具时,发生了这个问题。
我为Windows更改了所有.xaml文件,因此它们的生成操作设置为"page"。我没有意识到这个项目也包含"app.xaml"和"app.xaml.cs"。
"app.xaml"也需要设置为"page",或者完全删除(连同"app.xaml.cs")。我做了前者,然后后者,因为我意识到文件是无用的。
另一个可能的解释是,您正在针对x86进行构建。右键单击解决方案并选择配置管理器。看看你是否在构建x86而不是任何CPU。
在我的例子中,在我的项目中有一个引用是错误的,但没有被报告。
我解决了我的问题,把所有的参考资料都读了一遍,即使它们是正确的。
由于某些原因,在项目之间复制.xaml和.cs后,生成操作有时会发生更改。请确保.xaml的生成操作是第页。
所以我意识到这是一个老问题,但我们也有类似的问题。我们可以使用vs2012构建一个项目,但不能使用命令行中的msbuild。我进入.proj文件,发现它在默认的"propertygroup"部分下没有"projecttypeguids"的记录,所以我添加了以下内容:
1 | <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> |
这是WPF的项目GUID。然后我删除并重新添加了用户控件,它开始工作。我不确定是否必须做最后一步,但它现在对我有效。
我刚遇到这个问题,结果发现我的项目存储在我的用户文件夹中,这个文件夹存储在网络上,我们暂时中断了网络。我做了一个构建;它抱怨我的文件在编辑器之外被修改过(它们没有;文件锁只是被借用了),它构建得很好,消除了关于
顺便说一句,如果你想知道,从网络驱动器开发东西是不好的做法。当您试图利用.NET的托管代码时,它会变得特别有问题;根据我的经验,每次您构建时,它都会变得异常。我忘了把这个小项目放在合适的文件夹里,结果付了价钱。
我也遇到了同样的问题,期望我将主窗口的xaml和cs复制到一个新文件中,然后将它们复制回原来的位置。然后我在尝试编译wpf应用程序之后得到了这个错误。
我修复这个错误的方法是重命名名称空间(从egnamespace->egnamespacenew),它再次工作。然后我将名称空间改回了原来的名称空间。
右键单击Project中的文件夹以创建对我来说是问题的新用户控件。我在文件夹外面创建了相同的控件,就是它。
我在VS2017的xamarin.forms项目中也遇到了同样的问题。阅读此Bug链接:
https://bugzilla.xamarin.com/show_bug.cgi?ID=33181×C53
解决这个问题:右击
在我的例子中,程序的实例已经在后台运行。我只是停止运行的实例并成功地构建程序。
是的,很多事情都可以…我会加上这个…确保app.xaml指向您的命名空间(应用文件所在的位置)+.app如。x:class="dx.app"<==确保这是app,而不是主页名
希望这对你也有用。
我也有同样的问题,我必须把我的共享项目转换成一个可移植的类库。
我也有同样的问题,但在我的情况下,这些都没有帮助。在我的情况下,我所拥有的每个WPF项目(包括新创建的项目)都因这个错误而停止编译。最后,我卸载了所有的.NET框架,然后重新安装了它们,一切又开始工作了。我也重新安装了Visual Studio,但结果没有影响。