2009-09-30 13 views
5

Dies ist mein erster Ausflug in benutzerdefinierte Steuerelemente, und es geht nicht gut. Ich habe ein benutzerdefiniertes Diagrammsteuerelement, das von Canvas abgeleitet ist.wpf benutzerdefinierte Steuerung nicht erkannt

namespace Grapher2 { 
    public class SeriesManager : Canvas { 
     public SeriesManager() { 
      ... 
     } 
    } 
} 

Es ist im selben Projekt und Namespace wie meine App definiert. Ich habe versucht, einen Verweis auf das Steuerelement in XAML Hinzufügen wie folgt:

<Window x:Class="Grapher2.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:graph="clr-namespace:Grapher2" 
Title="Grapher" Width="800" Height="600"> 

<StackPanel Name="container" Width="700" Height="500"> 
    <graph:SeriesManager Name="seriesManager" Width="700" Height="500" /> 
</StackPanel> 

Aber wenn ich versuche, die Kontrolle Namen „seriesManager“ in der Code-Behind für das Fenster zu verweisen, erhalte ich „Der Name 'seriesManager' existiert im aktuellen Kontext nicht. "

Darüber hinaus wird der XAML-Editor das Fenster nicht rendern, was eine große Stack-Ablaufverfolgung mit dem Fehler gibt: "Type 'MS.Internal.Permissions.UserInitiatedNavigationPermission' in Assembly 'PresentationFramework, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 'ist nicht als serialisierbar markiert. "

Ich stelle mir vor, die Lösung ist etwas dumm für jeden, der benutzerdefinierte Steuerelemente getan hat. Aber ich bin ratlos.

Antwort

11

haben Sie versucht x: Name = "seriesManager" in Ihrem XAML?

Bearbeiten: Dies ist möglicherweise nicht das Problem zu sehen, wie Sie sagten, dass Ihre XAML nicht gerendert wird. Ich schätze, sobald Sie die Xaml in den Designer zu rendern ... der Code dahinter wird besser funktionieren.

Edit 2: Immer wenn ich ein Problem mit dem Designer-Rendering hatte, ist es, weil ich etwas im Konstruktor meines benutzerdefinierten Steuerelements mache. Überprüfen Sie Ihren SeriesManager, um festzustellen, ob Sie etwas in seinem Konstruktor tun, das ein Problem verursacht. Vielleicht verweisen Sie auf etwas, das noch nicht existiert. Wenn Sie in Ihrem Konstruktor zusätzlichen Code haben, ziehen Sie in Betracht, ihn zum Ereignis UserControl_Loaded zu verschieben.

+4

x: Der Name ist für Referenzen innerhalb derselben Baugruppe erforderlich, dies sollte das Problem beheben, dass im Code-Behind nicht auf "seriesManager" verwiesen werden kann. Weitere Informationen: http://stackoverflow.com/questions/1380112/why-cant-i-use-the-name-attribute-on-usercontrol-in-the-same- assembly – Zenuka

+0

Oh und BTW mit dem x: Name statt von Name könnte alle deine Probleme beheben, versuche dies zuerst und lass es uns wissen, wenn es mehr Probleme gibt ... – Zenuka

+1

x: Name hat es behoben! Vielen Dank! – Klay

0

Sichern von Scott Antwort hier, da er mir half es lösen:

Was ich falsch gemacht habe versucht, die Kontrolle VOR InitializeComponent() zugreifen zu können, wurde aber von zwei anderen Fehlermeldungen an anderer Stelle im Code verwirrt. Nur für den Fall, dass jemand anders diesen Fehler hat.

Verwandte Themen