5 Stimmen

wpf benutzerdefiniertes Steuerelement nicht erkannt

Dies ist mein erster Versuch mit benutzerdefinierten Steuerelementen, und es läuft nicht gut. Ich habe eine benutzerdefinierte Grafik-Steuerelement von Canvas abgeleitet.

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

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

<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, den Namen des Steuerelements "seriesManager" im Code-Behind für das Fenster zu referenzieren, erhalte ich die Meldung "Der Name 'seriesManager' ist im aktuellen Kontext nicht vorhanden".

Außerdem kann der XAML-Editor das Fenster nicht rendern und gibt einen umfangreichen Stack-Trace mit der Fehlermeldung aus: "Type 'MS.Internal.Permissions.UserInitiatedNavigationPermission' in Assembly 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable."

Ich kann mir vorstellen, dass die Lösung für jeden, der sich mit benutzerdefinierten Steuerelementen auskennt, denkbar einfach ist. Aber ich bin verblüfft.

11voto

Scott Punkte 11560

Haben Sie x:Name="seriesManager" in Ihrer Xaml-Datei ausprobiert?

Bearbeiten: Dies kann nicht das Problem sein, sehen, wie Sie sagten, dass Ihre Xaml nicht gerendert ist. Ich vermute, sobald Sie die Xaml im Designer zu rendern... der Code dahinter wird besser funktionieren.

Edit 2: Immer wenn ich ein Problem mit der Darstellung des Designers hatte, lag es daran, dass ich etwas im Konstruktor meines benutzerdefinierten Steuerelements gemacht habe. Überprüfen Sie Ihren SeriesManager, um zu sehen, ob Sie etwas in seinem Konstruktor tun, das ein Problem verursacht. Vielleicht verweisen Sie auf etwas, das noch nicht vorhanden ist. Wenn Sie zusätzlichen Code in Ihrem Konstruktor haben, sollten Sie ihn in das Ereignis UserControl_Loaded verschieben.

4 Stimmen

X:Name ist für Referenzen innerhalb der gleichen Baugruppe erforderlich, dies sollte das Problem beheben, dass "seriesManager" im Code-Behind nicht referenziert werden kann. weitere Informationen: stackoverflow.com/questions/1380112/

0 Stimmen

Oh und BTW, die Verwendung von x:Name anstelle von Name könnte alle Ihre Probleme lösen, versuchen Sie dies zuerst und lassen Sie uns wissen, wenn es weitere Probleme gibt...

0voto

Ich unterstütze die Antwort von Scott, da er mir bei der Lösung des Problems geholfen hat:

Was ich falsch gemacht habe, war der Versuch, auf das Steuerelement VOR InitializeComponent() zuzugreifen, wurde aber durch 2 andere Fehlermeldungen irgendwo anders im Code verwirrt. Nur für den Fall, dass jemand anderes diesen Fehler hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X