Im Folgenden beschreibe ich, wie ich einen Fehler reproduzieren kann, den ich erhalte. Es verhält sich in VS 2010, 2012 und 2013 genauso. Es ist wichtig, es in mehrere Projekte zu unterteilen, wie ich unten andeute.Tritt diese Namespace-Kollision aufgrund eines Fehlers in der XAML-zu-.NET-Codegenerierung auf?
Schritte, den Fehler zu reproduzieren:
eine Lösung erstellen.
erstellen # Klassenbibliothek C Deutsche genannt, enthält eine Datei namens Handler.cs:
using System; namespace Common { public delegate void Handler(object sender, EventArgs args); }
ein Projekt Benutzersteuer Bibliothek WPF erstellen MyControlLibrary genannt, verweisen Common. Erstellen Sie in diesem ein Benutzersteuerelement mit Name MyControl.xaml.
MyControl.xaml:
<UserControl x:Class="ControlNamespace.MyControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> </Grid> </UserControl>
MyControl.xaml.cs:
using System.Windows.Controls; using Common; namespace ControlNamespace { public partial class MyControl : UserControl { public MyControl() { InitializeComponent(); } public event Handler MyEvent; } }
eine WPF-Anwendungsprojekt namens MyWpfApplication Erstellen, gemeinsame und MyControlLibrary verweisen. Erstellen Sie in diesem Fenster WindowNamespace.Common.cs sowie ein Fenster namens MyWindow.xaml.
WindowNamespace.Common.cs:
namespace WindowNamespace.Common { }
MyWindow.xaml:
<Window x:Class="WindowNamespace.MyWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:ControlNamespace;assembly=WpfControlLibrary1" Title="MyWindow" Height="300" Width="300"> <Grid> <c:MyControl MyEvent="MyControl_MyEvent" /> </Grid> </Window>
MyWindow.xaml.cs:
using System; using System.Windows; namespace WindowNamespace { public partial class MyWindow : Window { public MyWindow() { InitializeComponent(); } void MyControl_MyEvent(object sender, EventArgs args) { } } }
die Lösung erstellen.
Sie sollten die folgende Fehlermeldung, zeigt 7 von MyWindow.xaml der Leitung:
The type or namespace name 'Handler' does not exist in the namespace 'WindowNamespace.Common' (are you missing an assembly reference?)
Wenn Sie die Datei .gics für MyWindow.xaml erzeugt öffnen, sollten Sie sehen die folgenden in die IComponentConnector.Connect Methode:
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Common.Handler(this.MyControl_MyEvent);
die Ursache des Problems ist, dass es versucht, Common.Handler in WindowNamespace zu finden. Dies könnte durch die gelöst werden nachdem es erzeugt wird, wie:
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new global::Common.Handler(this.MyControl_MyEvent);
oder durch Verwendung eines auf den Anfang der Datei hinzufügen:
using Common;
...
#line 7 "..\..\MyWindow.xaml"
((ControlNamespace.MyControl)(target)).MyEvent += new Handler(this.MyControl_MyEvent);
Beachten Sie, dass, wenn alle diese Quelldateien in einem einzigen Projekt gebündelt werden, Der Fehler verschwindet, da die .gics-Datei anders generiert wird (dh der Handler wird dem Ereignis nicht explizit hinzugefügt).
Ist das tatsächlich ein Fehler in der XAML -> .NET-Übersetzung, oder mache ich etwas falsch?
Vielen Dank für die Mühe, dieses Problem zu reproduzieren. Schade, es gibt noch keine Lösungen. Es scheint, dass einige ** clr-namespace: ... ** Anpassung ** ** global: ** im Namespace würde Probleme beheben. –