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


383

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

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

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

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

Что не так?


3
Эта пользовательская «ошибка» выглядит легко решаемой, просто простое определение x: Class. Пока все в порядке, разработчик должен уделять больше внимания, но что, если это не ошибка, а ложная ошибка с тем же сообщением об ошибке? Я прочитал МНОЖЕСТВО различных обходных путей voodoo с 2012 года. Это помогло бы с помощью VS очень четкого сообщения об ошибке и OF COURSE исправления для ошибочных ошибок с тем же сообщением. С 2012 года разработчики меняют конфигурацию сборки из файлов, проектов, вставляют копии проекта, удаляют файлы из папки приложения, перезагружают VS и т. Д. Bravo MS ... ошибка на 4 года и она продолжает стареть!
Juagicre

2
Для любых будущих читателей этого вопроса: эта проблема, кажется, имеет много возможных источников. В моем случае первые несколько ответов не помогли, но один из ответов ниже был правильным.
MOnsDaR

@MOnsDaR Пространство имен файла Designer было проблемой для меня.
Ctrl S

Хотя это может быть вызвано многими причинами (Пространство имен переименовано в \ Тип страницы - MSBuild), в конце концов я нашел решение для того, что вызвало его в проекте, который я унаследовал. В файлах .csproj мне пришлось изменить «ToolsVersion» с 4 на 15 (VS 2017).
MrMikeJJ

Ответы:


738

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

Так что проверьте, сделали ли вы то же самое.

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

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

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

10
Спасибо, Шон. Я пришел сюда, чтобы опубликовать этот ответ, но вы уже опередили меня. Это именно то, что произошло, и это решило мою проблему. Ваш комментарий должен быть выше чартов, потому что это сэкономило бы мне 15 минут.
Магнум

2
Если имена классов не совпадают, вы получите ту же ошибку
reggaeguitar

2
Это ответ. Не уверен, почему он не был выбран, но это все, и я столкнулся с этой кодировкой некоторых Xamarin.Forms.
Маркус Шокли

1
При рефакторинге обязательно добавляйте комментарии и строки (Visual Studio 2015)
Gabriel GM,

3
Для меня (в Xamarain.Forms) при использовании проекта «Быстрый старт», загруженного из Azure, это был пробел / отступ между xmlns: x = « schemas.microsoft.com/winfx/2009/xaml » и x: Class, который был проблема. Я удалил это и перепечатал это, и это работало!
Джеймс

241

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


11
Это было то, что происходило со мной. Спасибо!
Игнасио Солер Гарсия

3
После вставки копии происходит изменение действия сборки xaml со страницы на Контент
Роберто

4
Все еще происходит в Visual Studio 2012 (обновление 2)
gumo

8
Все еще происходит в Visual Studio 2013
Крис Рэй,

7
Серьезно ... почему Microsoft, почему? Ты ненавидишь меня / нас?
qwertoyo

106

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

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

Этот метод работал для меня в VS 2015, и, по словам других пользователей, также 2017 и 2019


3
Ты мой герой сегодня. Спасибо
Питер Пит

14
Достаточно безумно, это работало для меня с VS2015. И это исправило все ошибки во всех файлах XAML. Это действительно момент WTF.
Уильям Денман

5
Черт, я только что сгорел от этого снова. К счастью, я нашел тот же ответ, за который уже проголосовал и прокомментировал. Я действительно должен, но это как заметка на мониторе.
Уильям Денман

3
То же самое в VS2017, и это исправлено.
Ганс

2
До сих пор работает в VS2019 ...
soulflyman

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

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


Кажется, у меня та же проблема, но у меня это не сработало.
LuckyLikey

Делайте это после проверки вашего XAML x:Classспички Namespace.Class.
Джейк

Тпй. этот простой трюк сделал это для меня.
Джил Адино

26

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

Решение включает в себя редактирование файла .csproj. Щелкните правой кнопкой мыши проект, вызвавший проблему, и выберите «Разгрузить проект». Щелкните правой кнопкой мыши по незагруженному проекту и выберите «Edit .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, щелкните его правой кнопкой мыши в обозревателе решений и выберите компиляцию «Обновить проект», и все, готово!


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

1
Я тоже попробовал, и это не помогло. Добавление нового импорта привело к появлению нового предупреждения (см. Ниже), но исходная ошибка все еще там. «C: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.WinFX.targets» не может быть импортирован снова. Он уже был импортирован в «C: \ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.NETFramework.targets (76,3)». Скорее всего, это ошибка разработки сборки. Этот последующий импорт будет проигнорирован. "
user316117

Я тоже только что попробовал, и это не сработало ...?
Сизонс

Спасибо, это исправило это для меня, в проекте, который я унаследовал.
MrMikeJJ

22

это случилось со мной, когда я случайно удалил ссылку на класс из определения 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">

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


это была не совсем моя проблема, но это помогло мне ее локализовать. У меня было пространство имен без имени класса впоследствии
Rivenfall

Это сработало для меня. спасибо
Sinaesthetic

Это помогло мне найти мою проблему, в моем случае я пропустил строку x: Class, добавив это в исправленный для меня
apc

18

Вы можете получить эту ошибку, когда вы импортируете класс из другого проекта или измените путь к файлу 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


О, мой бог! действительно спасибо за это решение. Я проверил каждое найденное там решение и ничего не получилось. Хитрость была в свойствах xamlфайла. +1
IgniteCoders

16

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

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

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


Это решило мою проблему.
Октябрь

16

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

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

Изменение namespaceв FileName.Designer.cs совпадающего FileName.cs немедленно решить эту проблему.


14

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

НАПРИМЕР

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

и код позади

namespace NotDockPanel

Это привело меня к обнаружению, что у моего дизайнера было неправильное пространство имен. Спасибо!
Ctrl S

13

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


1
Я ничего не переименовал? Однако это решение сработало для меня. * .G.cs и * .gics отсутствовали в папке obj, комментируя ее и создавая проект, генерировал отсутствующие файлы. Не уверен, как он попал в это состояние.
finlaybob

11

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

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

Этот работал для меня. Я сделал копию, вставил и переименовал свой пользовательский элемент управления, когда InitializeComponent () начал давать сбой.
Рафаэль Вентура

Как же ты наткнулся на это исправление? Я попробовал все остальное, и это сработало. Использование VS 2017, поэтому проблема актуальна.
blearyeye

Отлично, это работает для меня. Большое спасибо
IZI

9

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

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


Я бы добавил это как комментарий к правильному ответу, но у меня нет представителя для этого :(
heights1976

Спасибо за это! Работал на меня после сумасшествия, пробуя разные вещи. Мое решение изначально собиралось без ошибок, затем после того, как компьютер некоторое время спал, попытался еще раз и получил ошибку. Может быть, что-то делать с режимом сна?
JeremyB

У меня была такая же проблема и решение. Я считаю, что это как-то связано с IntelliSense. Изменение пространства имен в xaml, вероятно, вызвало обновление соответствующих частей в базе данных IntelliSense. Это всего лишь предположение.
FishySwede

8

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

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

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


Ура, сэр / мадам!
Naspinski

7

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


7

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


Спасибо, сработало для меня!
Изион

6

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

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

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


5

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



4

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


3

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

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


Я получил ту же ошибку из-за отсутствия атрибута x: Class, но он не имеет ничего общего с Nuget. Просто как-то исчезло, возможно, какая-то визуальная студийная магия.
Исмаил Дегани

3

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

Я закомментировал ресурсы в файле 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
}

3

Для тех, кто находит это в интернете. Проверьте файл 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>

В моем csproj <DependentUpon>YourFile.xaml</DependentUpon>по какой-то причине мне не хватало, и это то, что исправило это для меня!
Исаак Бейкер

3

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

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

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


Вы имеете в виду открытие и закрытие визуальной студии?
LuckyLikey

Иногда XDesProc.exe (Microsoft Visual Studio XAML Designer UI) останавливает работу Visual Studio должным образом и не загружает файл xaml должным образом. Поэтому перезапуск Visual Studio решил мою проблему. (Вы также можете перейти к процессам в диспетчере задач и остановить только этот процесс без перезапуска Visual Studio).
Сайед Сирадж Ваджид

Я обнаружил это в VS2017. Я изменил все остальное, и пространства имен везде были правильными, но в вызовах InitializeComponent () произошла ошибка, а у частичных ключевых слов в файлах xaml.cs было предупреждение, что-то вроде «частичный класс имеет только один файл». Мне довелось закрыть и снова открыть решение, и я обнаружил, что обе эти проблемы решили сами.
Стив Крейн

3

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

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


3

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

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


Все остальные особенности, упомянутые в вопросе, были одинаковыми?
marklark

2
Точная специфика не является точной, учитывая, что неясно, как проявилось исключение. Однако основной симптом идентичен, поэтому я не вижу ничего плохого в своем ответе. Мое намерение состояло в том, чтобы добавить к беседе, поскольку никакой ответ / комментарий не помог в моем случае. Я просто пытался добавить в базу знаний часто неописуемые ошибки компиляции.
Rock

1
Спасибо! Это решило мою проблему! Кажется, что данная опция ( объект запуска ) была сброшена автоматически, когда я переместил MainWindow.xaml из rootв Viewкаталог.
AlexMelw

3

Поскольку это, похоже, тема для решения проблемы отсутствия «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>

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

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

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

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


2

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

Кстати, если вам интересно, разработка чего-либо с сетевого диска - плохая практика. Это становится особенно проблематичным, когда вы пытаетесь использовать управляемый код .NET; по моему опыту, это бесится каждый раз, когда вы строите. Я забыл поместить этот маленький одноразовый проект в нужную папку и в итоге заплатил цену.


2

Другое возможное объяснение - это то, что вы строите против x86. Щелкните правой кнопкой мыши свое решение и выберите Configuration Manager. Посмотрите, используете ли вы x86 вместо любого процессора.


2

Поэтому я понимаю, что это старый вопрос, но у нас была похожая проблема. Мы смогли построить проект, используя VS2012, но не используя msbuild из командной строки. Я вошел в файл .proj и заметил, что в нем нет записи для «ProjectTypeGuids» в разделе «PropertyGroup» по умолчанию, поэтому я добавил это:

<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

который является GUID проекта для WPF. Затем я удалил и снова добавил UserControl, и он начал работать. Я не уверен, что должен был сделать этот последний шаг, но сейчас он работает для меня.


2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.