web-dev-qa-db-fra.com

Le nom 'InitializeComponent' n'existe pas dans le contexte actuel

Si je crée un nouveau projet dans Visual Studio 2010 SP1 et que je sélectionne "Application WPF" et tente de générer l'application générée, le message d'erreur s'affiche.

Le nom 'InitializeComponent' n'existe pas dans le contexte actuel.

J'ai eu une erreur similaire ce matin quand j'ai essayé de construire mon projet actuel. Hier, je n’ai eu aucun problème à le compiler et à l’exécuter.

J'ai créé un nouveau projet et j'ai eu l'erreur chaque fois que j'ai compilé le projet. Je viens d'envoyer le projet à un collègue, qui vient de compiler sans erreur.

Qu'est-ce qui ne va pas?

347
user876402

Je l'ai rencontré plusieurs fois et j'oublie sans cesse ce qui le cause. J'ai rencontré ce problème lorsque j'ai renommé l'espace de noms sur mon code derrière le fichier, mais pas dans mon XAML.

Alors vérifiez si vous avez fait la même chose.

Les noms namespace et class doivent correspondre car ils font tous les deux partie d'une classe partielle

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

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

L'action de génération pour le fichier .xaml doit également être définie sur "Page". Lors du déplacement d'un fichier xaml entre projets, ce paramètre est perdu (au moins dans VS 2010).

220
Segfault

Pour ceux qui n'ont aucune erreur en mode débogage, mais do ont l'erreur spécifiée en mode publication (et pourtant le projet fonctionne bien), voici quelque chose de simple à essayer:

  1. Ouvrez le fichier XAML correspondant au fichier xaml.cs incriminé.
  2. Faire une édition - n'importe quelle édition, comme ajouter un espace quelque part
  3. Enregistrez le fichier et fermez-le

Cette méthode a fonctionné pour moi dans VS 2015, et selon d'autres utilisateurs, également en 2017 et 2019

76
BCA

Il y a une raison très spécifique à cela et cela se trouve dans les paramètres du projet. Cela se produit généralement lorsque vous essayez d'ajouter un contrôle/une fenêtre WPF à une bibliothèque de classes .NET 2.0 ou à un projet. La raison de cette erreur est que le projet ne sait pas qu'il construit un contrôle ou une fenêtre WPF et tente donc de le construire en tant que projet C # 2.0.

La solution implique la modification du fichier .csproj. Faites un clic droit sur le projet à l'origine du problème et sélectionnez "Décharger le projet". Cliquez avec le bouton droit sur le projet non chargé et sélectionnez "Modifier le fichier .csproj". Le fichier .csproj va s'ouvrir et vous pouvez voir le code XML. cherchez la ligne suivante:

<Import Project=…..

C'est vers la fin du fichier, et la seule ligne que vous avez est probablement

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

Cela indique à Visual Studio de générer le projet en tant que projet .NET 2.0. Ce que nous voulons faire, c'est dire à Visual Studio qu'il s'agit en fait d'un projet WPF. Nous devons donc ajouter la ligne suivante:

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

Cette ligne indiquera à Visual Studio de générer le projet en tant que projet WPF. Maintenant, votre fichier .csproj devrait ressembler à ceci:

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

Enregistrez le fichier .csproj, cliquez dessus avec le bouton droit de la souris dans l'Explorateur de solutions et sélectionnez "Recharger le projet" pour compiler. Le tour est joué!

25
Shailender Singh

cela m'est arrivé quand j'ai accidentellement supprimé la référence de classe de la définition de xaml:

J'ai remplacé le

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

première ligne avec ceci:

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

Je sais que ce n'est pas la réponse à la question initiale (parce que le projet repose sur une autre machine), mais le message d'erreur était le même, alors peut-être que j'aiderai quelqu'un avec cette situation.

22
p3d3str1an
  1. Accédez au répertoire de la solution
  2. Supprimer le dossier\obj
  3. Reconstruire la solution

J'ai rencontré cette erreur lors du refactoring où j'ai renommé certains fichiers/dossiers et les fichiers prexisiting * .g.cs devaient être régénérés.

22
JordanBean

Assurez-vous que dans le fichier xaml

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

correspond au nom "Projet1" et au nom "Page1"

16
Song

Vous pouvez obtenir cette erreur lorsque vous importez une classe d'un autre projet ou modifiez le chemin du fichier xaml ou l'espace de noms du fichier xaml ou derrière le fichier .cs.

Un: Il pourrait avoir un espace de noms différent de ce que vous avez dans votre nouveau projet

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

Comme vous pouvez le voir, l’espace de nom dans le fichier importé commence par l’ancien nom du projet: "TrainerB" , mais votre nouveau projet pourrait avoir un nom différent, il suffit donc de le remplacer par le nouveau nom de projet correct, à la fois dans le fichier .xaml et dans le fichier .cs situé en aval.

Deux:

modifiez les propriétés du fichier .xaml en:

Action de génération: Ressource incorporée

Outil personnalisé: MSBuild: UpdateDesignTimeXaml

Xaml file properties

Xaml Namespace Correcting 01

Xaml Namespace Correcting 02

15
Reader Man San

J'ai eu ceci (bien que ce soit vraiment de ma faute et que cela ait été causé après avoir copié et collé du code); cela peut se produire lorsque l'espace de nom ne correspond pas entre XAML et le code derrière

PAR EXEMPLE

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

et le code derrière est

namespace NotDockPanel
14
Dave

J'ai rencontré cela en renommant un usercontrol. La façon dont j'ai résolu le problème consistait à commenter InitializeComponent, à vérifier que tous les noms étaient corrects (xaml et code derrière), à ​​générer le projet, à annuler la mise en commentaire de InitializeComponent, puis à générer à nouveau. Il semble y avoir plusieurs causes/solutions à ce problème, mais de cette manière, cela a été fait pour moi.

13
Morgan Herlocker

Aucune des réponses ci-dessus n'a fonctionné pour moi. Je les ai tous essayés sauf ceux en double. Cependant, pour une raison étrange, cela a fonctionné dans mon projet multiplate-forme dans Visual Studio 2015:

  1. Cliquez avec le bouton droit sur le projet à l'origine du problème dans l'Explorateur de solutions. Dans le menu contextuel, choisissez: Ajouter -> Classe
  2. Sélectionnez multiplate-forme -> Formulaires Xaml Page. Conservez le joli nom standard Page1.cs et cliquez sur Ajouter.
  3. Remarquez comment le problème initial InitializeComponent () - a tout simplement disparu pour une raison quelconque.
  4. Supprimez le Page1.cs nouvellement créé et poursuivez la programmation comme si Visual Studio fonctionnait parfaitement.
9
Anders

Consultez le fichier Designer .

J'ai eu le même problème. Dans mon cas, la cause était que la namespace pour FileName.Designer.cs ne correspondait pas à la (correcte) namespace utilisé dans FileName.cs .

Changer la namespace de NomFichier.Designer.cs pour correspondre à celle de NomFichier.cs a résolu le problème immédiatement.

9
Ctrl S

Je suis d'accord avec la réponse ci-dessus que les espaces de noms doivent correspondre. Cependant, j'ai eu un problème comme celui-ci où les espaces de noms correspondaient.

Pour résoudre ce problème, j'ai simplement changé l’espace de noms dans le XAML en un espace INCORRECT, sauvegardé, puis je l’ai redéfini en CORRECT. Voila!

8
heights1976

Déchargez toute la solution, puis rechargez-la à nouveau. Ensuite, reconstruisez la solution. Cela a résolu le problème pour moi.

7
Eldhose

Si vous utilisez Xamarin Forms et que vous déplacez un fichier XAML, "l'action de génération" du fichier est modifiée. Xamarin Forms requiert "l'action de construction = la ressource incorporée".

Appliquez une "action de génération" dans Visual Studio:

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

7
Tonatio

Une autre cause fréquente de cette erreur est si vous avez fait quelque chose dans ceci:

  1. Cliquez avec le bouton droit sur le dossier du projet pour créer un nouveau UserControl. Cela crée une classe et un fichier xaml dérivés du contrôle de l'utilisateur dans l'espace de noms du dossier.

  2. Ensuite, vous décidez de modifier l’espace de noms de la classe car vous utilisez en fait uniquement des dossiers pour l’organisation du code. L'attribut x: Class ne sera pas automatiquement mis à jour. Il recherchera donc une classe qui n'existe pas. Pourrait probablement utiliser un meilleur message d'erreur du type "x: le type de classe est introuvable dans namesace bla.blaa.blaaa."

6
user1834059

J'essaie toutes les suggestions ci-dessus. Si vous essayez aussi sans succès, obtenez le moyen le plus simple. Créez un nouveau page.xaml puis copiez votre code pour la nouvelle classe et supprimez la classe XAML avec des problèmes. Ne passe pas plus de temps.

6
Diego Venâncio

Une autre solution à ce problème consiste simplement à changer la propriété-> Action de construction sur le XAML à partir de ressource incorporée, à enregistrer autre chose, à enregistrer, puis à la redéfinir de nouveau en ressource incorporée. L'erreur disparaît.

4
Mark McCorkle

Après une action, l’espace de noms du fichier .cs et celui du fichier .xaml peuvent être différents (dans xaml, recherchez x: Class = "namespace.yourType").

Fixez-les pour qu'ils soient identiques.

3
Mauro Sampietro

Pour ceux qui trouvent cela sur internet. Vérifiez le fichier Windows.csproj si la compilation est là. Il devrait y avoir 2 entrées

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

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

Cela a résolu le problème pour moi.

J'avais commenté les ressources dans le fichier 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>

Commenter ce retour pour corriger l'erreur de construction.

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

En creusant un peu plus, j'ai trouvé que le fichier app.g.cs dans {Project}\obj\debug ne contenait que ce qui suit lorsque j'ai quitté la ressource commentée.

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

J'ai découvert que "l'objet de démarrage" était (non défini) provoquant cette erreur pour moi.

"Objet de démarrage" (Non défini)

3
Rock

Étant donné que cela semble être le fil conducteur du problème concernant le manquant "InitializeComponent", je vais inclure ma réponse ici.

J'avais moi aussi ce problème et j'ai essayé tout ce que j'ai trouvé ici et dans tous les autres forums que Google a pu trouver, mais aucun n'a résolu le problème pour moi. Après deux heures d’essais, j’ai enfin compris ce qui n'allait pas avec ma configuration .

Dans notre projet, nous utilisons des composants Metro de MahApps . La vue qui me causait des problèmes était une vue héritée de MetroWindow, comme ceci:

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

Maintenant, j'ai défini mes ressources statiques comme

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

C'est ainsi que j'ai défini les ressources dans UserControls dans toutes mes autres vues, c'est donc ce qui, je suppose, fonctionnera.

Ce n'était cependant pas le cas avec Controls:MetroWindow! Là j'avais absolument besoin de la définition de ressource comme suit:

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

Donc, mon problème, en résumé, était une balise manquante <ResourceDictionary>. Je ne sais vraiment pas pourquoi cela a provoqué l'erreur 'InitializeComponent' et, étrangement, il ne l'a même pas produite sur toutes mes machines, mais c'est comme cela que je l'ai corrigée. J'espère que cela vous aidera (les 0,001% restants des personnes rencontrant ce problème).

3
Tom Ladek

Je sais que la réponse à cette question est due à une cause différente, mais il s'agit d'un message très populaire et j'avais rencontré le même problème avec une bibliothèque de classe. Dans ce cas, il s’est avéré qu’il s’agissait à la fois d’une modification de mon espace de nom (réponse fournie dans ce message ici ) et que le compilateur ne pouvait pas reconstruire le fichier Window.g.i.cs qui définit la méthode InitializeComponent (). Cela n'a pas pu car la bibliothèque de classes n'avait pas la valeur ProjectTypeGuid pour les projets WPF dans le fichier csproj. Les instructions pour ceci sont ici et ici . Je pensais que je partagerais dans le cas où quelqu'un d'autre a rencontré le même problème. Changer l'espace de nom n'est pas suffisant dans ce cas.

3
bjhuffine

Cela m'est arrivé parce qu'un désinstallateur de paquet Nuget a détruit tous les attributs de l'élément <Application> dans App.xaml. Cela incluait l'attribut x: Class, qui spécifie le nom de la classe d'application. Ainsi, la classe partielle contenant la méthode InitializeComponent () n'a jamais été générée.

J'ai résolu le problème en rétablissant App.xaml en copie contrôlée par la source.

3
Richard Beier

Si les espaces de noms sont corrects, il y a aussi une même erreur,

Fermez simplement votre application et ouvrez-la à nouvea.

Cela peut résoudre votre problème

3
Syed Siraj Wajeed

Donc, je me rends compte que c'est une question plus ancienne, mais nous avions un problème similaire. Nous avons pu créer un projet à l'aide de VS2012, mais pas à l'aide de msbuild à partir de la ligne de commande. Je suis allé dans le fichier .proj et j'ai remarqué qu'il ne possédait pas d'enregistrement pour "ProjectTypeGuids" dans la section "PropertyGroup" par défaut. J'ai donc ajouté ceci:

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

qui est le projet GUID pour WPF. J'ai ensuite supprimé et rajouté le UserControl et il a commencé à fonctionner. Je ne sais pas si je devais faire cette dernière étape, mais cela fonctionne pour moi maintenant.

2
Jon Nos

Pour une raison quelconque, après avoir copié .xaml et son .cs entre projets, l'action de construction change parfois. Assurez-vous que l’action de compilation de votre fichier .xaml est Page.

2
Marek Malczewski

Dans mon cas, il y a eu une référence dans mon projet qui était fausse mais qui n'a pas été rapportée.

J'ai résolu mon problème de lecture de toutes mes références, même si elles étaient censées être correctes.

2
LuckyLikey

Je viens de rencontrer ce problème et il s’est avéré que mon projet est stocké dans mon dossier d’utilisateur, qui est stocké sur le réseau, ce qui a entraîné une panne momentanée du réseau. J'ai fait une construction; il s'est plaint que mes fichiers avaient été modifiés en dehors de l'éditeur (ce n'était pas le cas; les verrous de fichiers venaient d'être bouchés), et tout s'est bien déroulé, en supprimant l'erreur relative à la méthode InitializeComponent().

BTW, au cas où vous vous le demanderiez, développer quelque chose à partir d'un lecteur réseau est une mauvaise pratique. Cela devient particulièrement problématique lorsque vous essayez de tirer parti du code géré par .NET; D'après mon expérience, cela effraie chaque fois que vous construisez. J'ai oublié de mettre ce petit projet jetable dans le dossier approprié et j'ai fini par en payer le prix.

2
J.D. Ray

Une autre explication possible est que vous construisez contre x86. Cliquez avec le bouton droit de la souris sur votre solution et choisissez Configuration Manager. Voyez si vous construisez contre x86 au lieu de N'importe quel processeur.

2
Peter

Avec VS2017 15.5.2, la meilleure solution pour un MCVE dans ce fil est de charger le XAML de LabelControlAdvancedSample , dernier exemple de cette page de didacticiel .

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

Après avoir laissé les paramètres App.xaml et App.xaml.cs par défaut, toute tentative de compilation de ce qui précède génère l'erreur de l'éditeur de liens.
Heureusement, lors du survol de l'instruction InitializeComponent () dans LabelControlAdvancedSample.xaml.cs , un indice de texte lié est présent:

Afficher les solutions potentielles.

En cliquant dessus, un autre texte lié est appelé:

Générer méthode MainWindow.InitializeComponent.

Cela produit la méthode "ne rien faire" suivante:

    private void InitializeComponent()
    {
        throw new NotImplementedException();
    }

La fonction doit être définie pour que le projet soit généré. On dirait que quelque chose diffère dans l'implémentation de InitializeComponent dans WPF en VB.Net .
Edit : le namespace.class dans la première ligne du xaml n’est pas correct. Selon MSDN et les @Sean B réponse , il devrait être

<Window x:Class="LabelControlAdvancedSample.MainWindow"

Ainsi, le projet se compile sans erreur et la méthode factice InitializeComponent n’est pas requise, elle génère en fait davantage d’erreurs. Va montrer que VS peut être utile, même dans le cas extrêmement rare d'erreur d'utilisateur. : P

2
Laurie Stearn

Ce problème s'est produit lors de la création d'un "projet d'application WPF", puis de la modification de sa cible de génération en "bibliothèque de classes" afin qu'elle soit utilisée comme outil externe par un autre programme.

J'ai modifié tous mes fichiers .xaml pour mes fenêtres afin que leur action de construction soit définie sur "Page". Ce que je n'avais pas réalisé, c'est que le projet contenait également "App.xaml" et "App.xaml.cs".

"App.xaml" doit également être défini sur "Page" ou supprimé complètement (avec "App.xaml.cs"). J'ai fait le premier, puis le dernier lorsque j'ai réalisé que les fichiers étaient inutiles.

2
Benoit Dufresne

J'ai eu le même problème dans VS2017, projet Xamarin.Forms. Lire ce lien de bogue:

https://bugzilla.xamarin.com/show_bug.cgi?id=33181#c5

Pour résoudre le problème dans ce cas: Cliquez avec le bouton droit de la souris sur [xaml-file-name].xaml, choisissez Properties, puis remplacez le Build Action par Content, puis revenez à Embedded resource.

1
Amir Rezazadeh

Dans mon cas, l'instance de programme s'exécutait déjà en arrière-plan. Je viens d'arrêter l'instance en cours d'exécution et le programme créé avec succès.

1
Gregor Ažbe

Faites un clic droit sur le dossier dans le projet pour créer un nouveau UserControl qui était le problème pour moi. J'ai créé le même contrôle en dehors du dossier et c'était tout.

1
Luk

J'ai eu le même problème, je pense que j'ai copié mon MainWindow xaml et cs dans un nouveau fichier et que je les ai ensuite copiés à leur emplacement d'origine. J'ai ensuite eu cette erreur après avoir essayé de compiler l'application WPF.

Ce que j'ai fait pour corriger cette erreur a été de renommer l'espace de noms (à partir de egNamespace -> egNamespaceNew, et cela a fonctionné à nouveau. J'ai ensuite redéfini l'espace de nom pour qu'il redevienne celui d'origine.

1
user3113237

J'ai eu le même problème, mais dans mon cas, rien de tout cela n'a aidé. Dans ma situation, chaque projet WPF que j'avais (y compris les projets nouvellement réalisés) avait cessé de compiler avec cette erreur. Finalement, j'ai désinstallé tous les frameworks .Net puis les ai réinstallés et tout a recommencé à fonctionner. J'ai également réinstallé Visual Studio, mais il s'est avéré que cela n'a eu aucun effet.

0
Jeff

J'ai eu le même problème, je devais convertir mon projet partagé en une bibliothèque de classes portable.

0
Kyle

yeap, tant de choses peuvent être ... Je voudrais ajouter celui-ci ... assurez-vous que App.xaml pointe vers votre espace de noms (où se trouve votre fichier d'application) + .App par exemple. x: Class = "DX.App" <=== assurez-vous qu'il s'agit de l'application et non du nom de la page principale

J'espère que cela fonctionne pour vous aussi.

0
ramnz