Имя InitializeComponent не существует в текущем контексте.

Если я создаю новый проект в Visual Studio 2010 с пакетом обновления 1 (SP1) и выбираю "Приложение WPF" и пытаюсь создать сгенерированное приложение, я получаю сообщение об ошибке

Имя InitializeComponent не существует в текущем контексте.

Сегодня утром я получил похожую ошибку, когда попытался построить свой текущий проект. Вчера у меня не было проблем с компиляцией и запуском.

Я создал новый проект и получал сообщение об ошибке при компиляции проекта. Я только что отправил проект коллеге, и он только что скомпилировал без ошибок.

Что случилось?

54 ответа

Я сталкивался с этим пару раз и продолжаю забывать, что вызывает это. Я столкнулся с этим, когда переименовал пространство имен в моем коде позади файла, но не в моем XAML.

Поэтому проверьте, сделали ли вы то же самое.

Имена пространств имен и классов должны совпадать, так как они оба являются частью частичного класса

namespace ZZZ
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
         //...
    }
}

<!-- XAML -->
<Window x:Class="ZZZ.MainWindow">

Действие Build для файла.xaml также должно быть установлено на "Страница", при перемещении файла xaml между проектами этот параметр теряется (по крайней мере, в VS 2010).

Для тех, у кого (в VS2015) нет ошибок в режиме отладки, но есть определенная ошибка в режиме выпуска (и все же проект работает нормально), вот что можно попробовать:

  1. Откройте файл XAML, соответствующий нарушающему файлу xaml.cs.
  2. Сделайте правку - любую правку, например, добавьте пробел где-нибудь
  3. Сохраните файл и закройте его

Этот метод работал для меня.

  1. Перейдите в каталог решений
  2. Удалить папку \obj
  3. Восстановить решение

Я столкнулся с этой ошибкой во время рефакторинга, когда я переименовал некоторые файлы / папки, и необходимо было сгенерировать прексиситирующие файлы *.g.cs.

Для этого есть очень специфическая причина, и это в настройках проекта. Это обычно происходит всякий раз, когда вы пытаетесь добавить элемент управления / окно WPF в библиотеку классов или проекта.NET 2.0. Причиной этой ошибки является то, что проект не знает, что он создает элемент управления или окно WPF, и поэтому пытается построить его как проект C# 2.0.

Решение включает в себя редактирование файла.csproj. Щелкните правой кнопкой мыши по проекту, вызывающему проблему, и выберите "Разгрузить проект". Щелкните правой кнопкой мыши по незагруженному проекту и выберите "Редактировать.csproj". Откроется файл.csproj, и вы сможете увидеть XML. ищите следующую строку:

<Import Project=…..

Это ближе к концу файла, и единственная строка, которая у вас есть, это, вероятно,

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

Это говорит Visual Studio о том, чтобы построить проект как проект.NET 2.0. Мы хотим сказать Visual Studio, что на самом деле это проект WPF, поэтому нам нужно добавить следующую строку:

<Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />

Эта строка сообщит Visual Studio о создании проекта как проекта WPF. Теперь нижняя часть вашего файла.csproj должна выглядеть так:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />

Сохраните файл.csproj, щелкните его правой кнопкой мыши в обозревателе решений и выберите компиляцию "Обновить проект", и все, готово!

Ни один из приведенных выше ответов не помог мне. Я перепробовал их все, кроме дубликатов. Однако по какой-то странной причине это сработало в моем кроссплатформенном проекте в Visual Studio 2015:

  1. Щелкните правой кнопкой мыши проект, который вызывает проблему в обозревателе решений. Во всплывающем меню выберите: Добавить -> Класс
  2. Выберите кросс-платформенный -> Forms Xaml Page. Оставьте красивое стандартное имя Page1.cs и нажмите "Добавить".
  3. Обратите внимание, что предыдущая проблема InitializeComponent() просто исчезла по какой-то причине.
  4. Удалите только что созданный Page1.cs и продолжайте программировать так, как будто Visual Studio работает нормально.

Это случилось со мной, когда я случайно удалил ссылку на класс из определения xaml:

Я заменил

<Window x:Class="myapp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

Первая строка с этим:

<RibbonWindow 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

Я знаю, что это не ответ на первоначальный вопрос (потому что этот проект построен на другом компьютере), но сообщение об ошибке было таким же, поэтому, возможно, я помогу кому-то в этой ситуации.

Вы можете получить эту ошибку, когда вы импортируете класс из другого проекта, или измените путь к файлу xaml, или пространство имен либо файла xaml, либо позади файла.cs.

Первый: у него может быть пространство имен, которое не совпадает с тем, что есть в вашем новом проекте

namespace TrainerB.MVC.Forms
{
     public partial class AboutDeveloper : ContentPage
     {
          public AboutDeveloper()
          {
               InitializeComponent();
          }
     }
}

Как вы можете видеть, пространство имен в импортированном файле начинается со старого имени проекта: "TrainerB", но ваш новый проект может иметь другое имя, поэтому просто измените его на правильное имя нового проекта, как в файле.xaml, так и в. задний файл.cs.

Два:

измените свойства файла.xaml на:

Действие построения: встроенный ресурс

Пользовательский инструмент: MSBuild: UpdateDesignTimeXaml

Свойства файла Xaml

Исправление пространства имен Xaml 01

Исправление пространства имен Xaml 02

Проверьте файл Designer.

У меня была такая же проблема. В моем случае причина была в том, что namespace для FileName.Designer.cs не соответствует (правильно) namespace используется в FileName.cs.

Изменение namespace FileName.Designer.cs, чтобы соответствовать FileName.cs, решил проблему немедленно.

У меня было это (хотя это была моя большая ошибка и была вызвана после того, как я скопировал и вставил некоторый код в); это может произойти, когда пространство имен не совпадает между XAML и кодом позади

НАПРИМЕР

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

и код позади

namespace NotDockPanel

Убедитесь, что в файле xaml

<Page x:Class="Project1.Page1" ...

сопоставьте имя "Project1" и имя "Page1"

Я столкнулся с этим при переименовании usercontrol. Чтобы исправить это, я закомментировал InitializeComponent, проверил, что все имена были правильными (xaml и код позади), собрал проект, раскомментировал InitializeComponent, а затем собрал снова. Похоже, что может быть несколько причин / решений для этой проблемы, но этот путь сделал это для меня.

Что мне помогло - это изменить первую строку в.csproj на

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

Я согласен с ответом выше, что пространства имен должны совпадать. Тем не менее, у меня была такая проблема, когда пространства имен совпадали.

Чтобы исправить, я просто изменил пространство имен в XAML на НЕПРАВИЛЬНОЕ, сохранил, а затем вернул обратно в ПРАВИЛЬНОЕ. Вуаля!

Выгрузите все решение, а затем снова загрузите его. Затем перестройте решение. Это решило проблему для меня.

Я пробую все предложения выше. Если вы попробуете тоже безуспешно, найдите более легкий путь. Создайте новый page.xaml, затем скопируйте свой код для нового класса и удалите класс XAML с проблемами. Не трать больше времени.

Если вы используете формы Xamarin и перемещаете файл XAML, "действие сборки" этого файла изменяется. Xamarin Forms требует "build action = Embedded Resource".

Примените "действие сборки" в Visual Studio:

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

Другое решение этой проблемы - просто изменить свойство-> Build Action на XAML с Embedded Resource на что-либо еще, сохранить, а затем снова изменить его на Embedded Resource. Ошибка уходит.

Если пространства имен верны, то также возникает та же ошибка,

Просто закройте свое приложение и откройте его снова.

Это может решить вашу проблему

Другая распространенная причина этой ошибки - если вы что-то сделали в этом:

  1. Щелкните правой кнопкой мыши папку в проекте, чтобы создать новый UserControl. Это создает файл класса и xaml, который получается из пользовательского контроля в пространстве имен папки.

  2. Затем вы решаете изменить пространство имен класса, потому что вы на самом деле просто используете папки для организации кода. Атрибут x:Class не будет автоматически обновляться, поэтому он будет искать класс, который не существует. Возможно, можно использовать лучшее сообщение об ошибке, например "x: Тип класса не найден в именах bla.blaa.blaaa".

Это случилось со мной, потому что деинсталлятор пакета Nuget уничтожил все атрибуты элемента в App.xaml. Сюда входит атрибут x:Class, который указывает имя класса приложения. Поэтому частичный класс, содержащий метод InitializeComponent(), никогда не создавался.

Я исправил проблему, вернув App.xaml в контролируемую исходным кодом копию.

Я обнаружил, что "Объект запуска" был (не установлен), вызывая эту ошибку для меня.

"Объект запуска" (не задан)

Я знаю, что на это ответили по другой причине, но это очень популярное сообщение, и я столкнулся с той же проблемой с библиотекой классов. В этом случае оказалось, что это и изменение в моем пространстве имен (об этом ответили в этом посте), и то, что компилятор не смог перестроить Window.gics, который определяет метод InitializeComponent(). Не удалось, потому что в библиотеке классов отсутствовало значение ProjectTypeGuid для проектов WPF в файле csproj. Инструкции для этого здесь и здесь. Я думал, что поделюсь, если кто-то столкнется с той же проблемой. В этом случае недостаточно просто изменить пространство имен.

Это решило это для меня.

Я закомментировал ресурсы в файле App.xaml

<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>

Комментируя это, вы исправили ошибку сборки.

<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>

Углубившись немного глубже, я обнаружил, что файл app.g.cs в {Project}\obj\debug содержал только следующее, когда я оставлял закомментированный ресурс.

/// <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
}

Для тех, кто находит это в интернете. Проверьте файл Windows.csproj, если есть компиляция. Там должно быть 2 записи

<Page Include="YourFile.xaml">
  <SubType>Designer</SubType>
  <Generator>MSBuild:Compile</Generator>
</Page>

<Compile Include="YourFile.xaml.cs">
  <DependentUpon>YourFile.xaml</DependentUpon>
</Compile>

Поскольку это, похоже, тема для решения проблемы отсутствия "InitializeComponent", я включу свой ответ здесь.

У меня тоже была эта проблема, и я перепробовал все, что нашел здесь и на всех других форумах, которые мог найти Google, однако ни один из них не решил эту проблему для меня. После двух часов попыток все, я наконец понял, что случилось с моей настройкой.

В нашем проекте мы используем компоненты Metro от MahApps. Представление, которое доставляло мне неприятности, было видом, унаследованным от MetroWindow, например так:

<Controls:MetroWindow x:Class="ProjectNamespace.MyView"
                      xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
                      ... >

Теперь я определил мои статические ресурсы как

<Controls:MetroWindow.Resources>
    <prop:Resources x:Key="LocalizedStrings"/>
    ...
</Controls:MetroWindow.Resources>

Вот как я определил ресурсы в UserControlво всех других моих взглядах, так что я предположил, что это сработает.

Это было, однако, не в случае с Controls:MetroWindow! Там мне абсолютно необходимо определение ресурса следующим образом:

<Controls:MetroWindow.Resources>
    <ResourceDictionary>
        <prop:Resources x:Key="LocalizedStrings"/>
        ...
    </ResourceDictionary>
</Controls:MetroWindow.Resources>

Таким образом, моя проблема, в итоге, пропала без вести <ResourceDictionary> тег. Я действительно не знаю, почему это привело к ошибке "InitializeComponent", и это странным образом даже не создавало ее на каждой моей машине, но именно так я ее исправил. Надеюсь, это поможет (остальные 0,001% людей сталкиваются с этой проблемой).

Эта проблема возникла для меня, когда я создал "Проект приложения WPF", а затем изменил его цель сборки на "Библиотеку классов", которая будет использоваться в качестве внешнего инструмента другой программой.

Я изменил все мои файлы.xaml для своих окон, чтобы их действие по сборке было установлено на "Страница". Чего я не понял, так это того, что проект также содержал "App.xaml" и "App.xaml.cs".

"App.xaml" также должен быть установлен в "Page" или полностью удален (вместе с "App.xaml.cs"). Я сделал первое, потом второе, так как понял, что файлы бесполезны.

После некоторых действий пространство имен файла.cs и пространство в файле.xaml могут различаться (в xaml ищите x:Class="namespace.yourType").

Исправьте их, чтобы они были одинаковыми.

По какой-то причине после копирования.xaml и его.cs между проектами действие сборки иногда меняется. Пожалуйста, убедитесь, что сборка вашего.xaml является Page.

В моем случае в моем проекте была ссылка, которая была неправильной, но об этом не сообщалось.

Я решил свою проблему с чтением всех моих ссылок, даже если они были правильными.

Другие вопросы по тегам