Имя 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) нет ошибок в режиме отладки, но есть определенная ошибка в режиме выпуска (и все же проект работает нормально), вот что можно попробовать:
- Откройте файл XAML, соответствующий нарушающему файлу xaml.cs.
- Сделайте правку - любую правку, например, добавьте пробел где-нибудь
- Сохраните файл и закройте его
Этот метод работал для меня.
- Перейдите в каталог решений
- Удалить папку \obj
- Восстановить решение
Я столкнулся с этой ошибкой во время рефакторинга, когда я переименовал некоторые файлы / папки, и необходимо было сгенерировать прексиситирующие файлы *.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:
- Щелкните правой кнопкой мыши проект, который вызывает проблему в обозревателе решений. Во всплывающем меню выберите: Добавить -> Класс
- Выберите кросс-платформенный -> Forms Xaml Page. Оставьте красивое стандартное имя Page1.cs и нажмите "Добавить".
- Обратите внимание, что предыдущая проблема InitializeComponent() просто исчезла по какой-то причине.
- Удалите только что созданный 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
Проверьте файл 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. Ошибка уходит.
Если пространства имен верны, то также возникает та же ошибка,
Просто закройте свое приложение и откройте его снова.
Это может решить вашу проблему
Другая распространенная причина этой ошибки - если вы что-то сделали в этом:
Щелкните правой кнопкой мыши папку в проекте, чтобы создать новый UserControl. Это создает файл класса и xaml, который получается из пользовательского контроля в пространстве имен папки.
Затем вы решаете изменить пространство имен класса, потому что вы на самом деле просто используете папки для организации кода. Атрибут x:Class не будет автоматически обновляться, поэтому он будет искать класс, который не существует. Возможно, можно использовать лучшее сообщение об ошибке, например "x: Тип класса не найден в именах bla.blaa.blaaa".
Это случилось со мной, потому что деинсталлятор пакета Nuget уничтожил все атрибуты элемента
Я исправил проблему, вернув 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.
В моем случае в моем проекте была ссылка, которая была неправильной, но об этом не сообщалось.
Я решил свою проблему с чтением всех моих ссылок, даже если они были правильными.