关于wpf:当前上下文中不存在名称“InitializeComponent”

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中)在调试模式下没有错误,但在发布模式下有指定错误(但项目运行良好)的人,下面是一些简单的尝试:

  • 打开与有问题的xaml.cs文件对应的xaml文件。
  • 进行编辑——任何编辑,比如在某个地方添加空间
  • 保存文件并关闭它
  • 这种方法对我很管用。


    有一个非常具体的原因,它在项目设置中。每当您试图将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是在另一台机器上构建的),但是错误消息是相同的,所以我可能会帮助其他人处理这种情况。


  • 导航到解决方案目录
  • 删除obj文件夹
  • 重建解决方案
  • 在重构过程中遇到了这个错误,我重命名了一些文件/文件夹,并且需要重新生成预先存在的*.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

    Xaml file properties

    Xaml Namespace Correcting 01

    Xaml Namespace Correcting 02


    重命名用户控件时遇到此问题。我修复它的方法是注释掉InitializeComponent,验证所有名称是否正确(XAML和代码隐藏),生成项目,取消对InitializeComponent的注释,然后重新生成。听起来这个问题可能有几个原因/解决方案,但我就是这样做的。


    我遇到过这种情况(尽管这是我的错,是在我复制和粘贴了一些代码之后造成的);当命名空间在XAML和后面的代码之间不匹配时,就会发生这种情况。

    1
    <UserControl x:Class="DockPanel.TreeView" />

    后面的代码是

    1
    namespace NotDockPanel


    以上所有的答案对我都不起作用。除了复制品,我都试过了。然而,由于一些奇怪的原因,这在我的Visual Studio 2015跨平台项目中起到了作用:

  • 在解决方案资源管理器中右键单击导致问题的项目。在弹出菜单中选择:添加-->类
  • 选择"跨平台"-->表单XAML页。保留漂亮的page1.cs标准名称,然后单击"添加"。
  • 注意前面的initializecomponent()-问题是如何因某种原因消失的。
  • 删除新创建的page1.cs并继续编程,就像Visual Studio工作正常一样。

  • 我同意上面的答案,即名称空间必须匹配。但是,在名称空间匹配的地方,我遇到了这样的问题。

    为了解决这个问题,我简单地将XAML中的名称空间更改为一个不正确的名称空间,然后保存,然后将其更改回正确的名称空间。哇!


    卸载整个解决方案,然后重新加载。然后重新构建解决方案。这解决了我的问题。


    如果您使用的是Xamarin表单,并且您移动了一个Xaml文件,那么该文件的"构建操作"将被更改。Xamarin表单需要"build action=embedded resource"。

    在Visual Studio中应用"生成操作":

    Select the XAML file -> Properties -> Build Action = Embedded Resource


    此错误的另一个常见原因是,如果您在其中执行了以下操作:

  • 右键单击Project中的文件夹以创建新的用户控件。这将创建从文件夹命名空间中的用户控件派生的类和XAML文件。

  • 然后您决定更改类的名称空间,因为您实际上只是使用文件夹来组织代码。x:class属性不会自动更新,因此它将搜索不存在的类。可能会使用更好的错误消息,如"在namesace bla.bla a.blaaa中找不到x:Class类型"。


  • 我尝试以上所有建议。如果你也尝试过而没有成功,那就找到更简单的方法。创建一个新的page.xaml,然后复制新类的代码并删除有问题的类xaml。不要多花时间。


    检查设计器文件。

    我也有同样的问题。在我的例子中,原因是filename.designer.cs的namespace与filename.cs中使用的(正确的)namespace不匹配。

    将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中元素的所有属性。这包括x:class属性,它指定了应用程序类名。因此,从未生成包含InitializeComponent()方法的分部类。

    我通过将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>

    这就是我在所有其他视图中定义UserControl中的资源的方式,所以这就是我假设的工作方式。

    不过,这不是江户十一〔一〕的情况!在这里,我绝对需要如下的资源定义:

    1
    2
    3
    4
    5
    6
    <Controls:MetroWindow.Resources>
        <ResourceDictionary>
            <prop:Resources x:Key="LocalizedStrings"/>
            ...
        </ResourceDictionary>
    </Controls:MetroWindow.Resources>

    总之,我的问题是缺少标签。我真的不知道这为什么会产生"初始化组件"错误,它甚至没有在我的每台机器上产生,但这就是我修复它的方法。希望这有帮助(剩下的0.001%的人遇到这个问题)。


    执行某些操作后,.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。然后我删除并重新添加了用户控件,它开始工作。我不确定是否必须做最后一步,但它现在对我有效。


    我刚遇到这个问题,结果发现我的项目存储在我的用户文件夹中,这个文件夹存储在网络上,我们暂时中断了网络。我做了一个构建;它抱怨我的文件在编辑器之外被修改过(它们没有;文件锁只是被借用了),它构建得很好,消除了关于InitializeComponent()方法的错误。

    顺便说一句,如果你想知道,从网络驱动器开发东西是不好的做法。当您试图利用.NET的托管代码时,它会变得特别有问题;根据我的经验,每次您构建时,它都会变得异常。我忘了把这个小项目放在合适的文件夹里,结果付了价钱。


    我也遇到了同样的问题,期望我将主窗口的xaml和cs复制到一个新文件中,然后将它们复制回原来的位置。然后我在尝试编译wpf应用程序之后得到了这个错误。

    我修复这个错误的方法是重命名名称空间(从egnamespace->egnamespacenew),它再次工作。然后我将名称空间改回了原来的名称空间。


    右键单击Project中的文件夹以创建对我来说是问题的新用户控件。我在文件夹外面创建了相同的控件,就是它。


    我在VS2017的xamarin.forms项目中也遇到了同样的问题。阅读此Bug链接:

    https://bugzilla.xamarin.com/show_bug.cgi?ID=33181×C53

    解决这个问题:右击[xaml-file-name].xaml,选择Properties,然后将Build Action改为Content,再改回Embedded resource


    在我的例子中,程序的实例已经在后台运行。我只是停止运行的实例并成功地构建程序。


    是的,很多事情都可以…我会加上这个…确保app.xaml指向您的命名空间(应用文件所在的位置)+.app如。x:class="dx.app"<==确保这是app,而不是主页名

    希望这对你也有用。


    我也有同样的问题,我必须把我的共享项目转换成一个可移植的类库。


    我也有同样的问题,但在我的情况下,这些都没有帮助。在我的情况下,我所拥有的每个WPF项目(包括新创建的项目)都因这个错误而停止编译。最后,我卸载了所有的.NET框架,然后重新安装了它们,一切又开始工作了。我也重新安装了Visual Studio,但结果没有影响。