2009-07-09 3 views
0

Ich habe eine sehr einfache Benutzerkontrolle, und ich versuche, es in XAML zu instanziieren. Ich finde, wenn ich mit dem Namespace ein wenig übereifrig vorgehe, stoße ich auf Probleme mit x: Name.Überspezifizierter Namespace in UserControl schlägt fehl WPF Build

Hier ist mein Usercontrol:

<UserControl x:Class="UserControlTest.UserControl1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300"> 
<Grid> 
    <Label Name="Label1">Label</Label> 
</Grid> 
</UserControl> 

Hier ist der Code-behind für die Usercontrol:

Namespace UserControlTest 
Partial Public Class UserControl1 

End Class 
End Namespace 

Nun beachten Sie, dass ich den Stammnamespace meiner VB.Net Projekt auf "UserControlTest". Zu wissen, dass, haben Sie einen Blick auf meine Hauptfenster: Hier ist mein Hauptfenster:

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:control="clr-namespace:UserControlTest.UserControlTest" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <control:UserControl1 /> 
</Grid> 
</Window> 

Sehen Sie, wie die Steuer alias haben „UserControlTest.UserControlTest“ braucht? Das ist, weil ich den Stammnamespace meines Projekts auf UserControlTest haben, und ich habe den Namensraum des Usercontrol definiert UserControlTest, auch zu sein. Wenn ich keinen Namespace für das UserControl verwende, habe ich keine Probleme.

jedoch, weil ich dies getan haben, schlägt der Build sollte ich versuchen, eine x anwenden: Namen dem Usercontrol, wie folgt:

<control:UserControl1 x:Name="test"/> 

, dass der Build fehlschlagen wird, mit diesem Fehler:

Type 'UserControlTest.UserControlTest.UserControl1' is not defined. 

Kann jemand erklären warum? Muss ich vermeiden, meine Benutzersteuerelemente in Namespaces zu setzen, nur damit ich ihnen x geben kann: Name Werte? Ich möchte meine UserControls von Code-behind manipulieren, und ohne einen x: Name, bin ich den Bach hinauf. Aber ich möchte die Namespace-Nutzung nicht opfern, nur um sie zu bekommen!

Vielen Dank.

Antwort

0

Was ist der Namensraum definiert, wie in dem Code-behind Ihrer Benutzerkontrolle?

Wenn Ihr Projekt wurde Foo genannt und man hatte einen Ordner namens Kontrollen innerhalb dieses Projektes, jede neue Steuer Benutzer hinzugefügt, dass Ordner mit dem Namespace Foo.Controls gegeben würden.

Dann in Ihrem XAML können Sie es wie so Referenz:

xmlns:Controls="clr-namespace:Foo.Controls" 
... 
<Controls:UserControl1 x:Name="uc1"/> 

Es scheint, wie Sie eine Namens Problem haben.

EDIT:

Hier ist, wie ich es in einem Projekt von mir mache.

StatusBar.xaml.cs

namespace Client.Controls.UserControls 
{ 
public partial class StatusBar : UserControl 
{ 
... 
} 
} 

StatusBar.xaml

<UserControl x:Class="Client.Controls.UserControls.StatusBar"> 
</UserControl> 

Main.xaml.cs

using Client.Controls.UserControls; 

namespace Client 
{ 
public partial class Main : Window 
{ 
... 
} 
} 

Main.xaml

<Window x:Class="Client.Main" 
xmlns:UserControls="clr-namespace:Client.Controls.UserControls"> 
<UserControls:StatusBar x:Name="mainStatusBar" /> 
</Window> 
+0

Meine Benutzerkontrolle hat keinen Namespace im Code-Behind definiert. Sind Sie sich sicher über die Benennung von Foo.Controls? Ich habe einen Controls-Ordner und ein neues UserControl darin hinzugefügt. Im Codebehind ist kein Namespace definiert. Mein Hauptfenster XAML hat xmlns: control = "clr-namespace: UserControlTest" (d. H. NICHT clr-namespace: UserControlTest.Control) und kann das neue UserControl in XAML mit dem Präfix control: erstellen. – TimH

+0

Bitte sehen Sie meine Bearbeitung. Hoffentlich macht es Sinn. – David

2

Ich hatte das gleiche Problem (nach dem Wiederaufbau des Projekts, zuerst hat es gut funktioniert ...). Ich habe UserControl in separaten Namespace.

0

Ich stieß auf das gleiche Problem in einem vb.net-Projekt, und trotz des Versuchs die Vorschläge hier und anderswo, konnte das Problem nicht lösen. In der Tat war ich in der Lage, den exakt gleichen Code aus unserem Projekt in ein neues Projekt zu übernehmen, und es funktionierte gut (soweit ich feststellen konnte, war die gesamte Konfiguration im neuen Projekt identisch). In der von David zur Verfügung gestellten Lösung bemerke ich, dass er C# benutzt - ich frage mich, ob das etwas mit vb.net verbundenes Unverständnis ist.

Am Ende war das Benutzersteuerelement, das ich verwenden musste, ziemlich einfach und ich implementierte es als Ressource ControlTemplate, um das Problem zu umgehen. Sorry, ich habe keine bessere Antwort, ich bin wirklich nicht glücklich mit meinen Ergebnissen ...

Verwandte Themen