3 Stimmen

WPF Typ während des Entwurfs erhalten?

Nun habe ich eine Steuerung, die von UserControl (Ansicht) erbt, und ich verwende sie so wie du eine UserControl (eine Basisklasse) verwendest. Hier liegt das Problem: Wenn ich das mache, bekomme ich verschiedene Meldungen zur Laufzeit und im Designmodus. Im Designmodus erhalte ich Ansicht und zur Laufzeit erhalte ich den Klassennamen der XAML-Datei, die die Ansicht erbt...

Wie kann ich den vererbenden Klassentyp im Designmodus anstelle der Basisklasse erhalten?

Hier kommt etwas Code:

Zuerst haben wir die Ansichtsklasse

public class View : UserControl
{
    public override void OnApplyTemplate()
    {
        MessageBox.Show(this.GetType().ToString());
        base.OnApplyTemplate();
    }
}

Dann haben wir eine XAML-Datei:

Wenn du nun "WpfApplication2.Test" in VisualStudio 2010 kompilierst und öffnest, erhältst du eine Meldung, die "WpfApplication2.View" sagt..

Aber wenn du die Test Steuerung in dein MainWindow platzierst und auf Ausführen (F5) drückst, erhältst du "WpfApplication2.Test".. Was ich möchte, ist die gleiche Antwort im Designmodus wie zur Laufzeit zu haben...

3voto

Mike Schenk Punkte 1482

Nun, das Problem ist, dass der XAML-Designer in Visual Studio 2010 nicht die tatsächliche Klasse instanziiert, die im Code-Behind deklariert ist. Stattdessen instanziiert er nur deren Basisklasse.

Wenn man darüber nachdenkt, während man sein XAML ändert, ändert man tatsächlich die Klasse, die im Code-Behind deklariert ist, da es sich um eine Teilklasse handelt, die mit einem anderen Teil aus dem XAML erstellt wurde. Der Designer kann also keine Instanz Ihrer Klasse erstellen: Sie wird immer noch erstellt.

Ich glaube nicht, dass Sie das, was Sie erreichen wollen, ohne das Schreiben von Code, der auf irgendeine Weise mit Visual Studio interagiert, um zu fragen, welche Datei tatsächlich entworfen wird, erreichen werden.

Sie können zumindest Ihren Code schützen, indem Sie einen Check für DesignerProperties.GetIsInDesignMode() verwenden.

Sehen Sie sich diese Links für einige verwandte Informationen an:

Fehlerbehebung bei Ladeproblemen des WPF-Designers

Was passiert, wenn die Ansicht des VS 2008 XAML-Designers versucht, die GUI zu rendern?

Machen Sie das nicht im WPF-Designer (Cider)!

1voto

Omer Mor Punkte 5168

Der VS2010 Designer (Cider) instanziiert eine Instanz der Basisklasse, wenn Sie ein abgeleitetes Steuerelement entwerfen. Sie können nichts dagegen tun.

1voto

Ondrej Tucny Punkte 26742

Bitte frage dich, warum du den Namen des Typs wissen möchtest und warum es Probleme bereitet, wenn dieser sich zur Designzeit unterscheidet. Es sei denn, du kämpfst gegen Windmühlen und wirst meiner Meinung nach keine vernünftige Antwort erhalten.

Update – Pseudocode einer einfachen Umgehungslösung:

if (IsDesignTime)
   verwende this.GetType()
else
   verwende this.GetType().BaseType

Update 2: Zur Designzeit gibt es keine Möglichkeit, den Namen der nachfolgenden Klasse abzurufen, die entworfen wird. Das Problem sollte wahrscheinlich auf eine andere Weise gelöst werden, die nicht vom Namen der tatsächlichen Klasse abhängt.

0voto

JonWillis Punkte 3056

Ich lerne noch WPF, also ist dies wahrscheinlich nicht das, wonach Sie suchen.

Zur Designzeit und zur Laufzeit gibt this.GetType().ToString(); mir in der Meldungsbox "WpfApplication2.View" zurück.

Also wird in beiden Modi Ansicht zurückgegeben. Ich werde sagen, dass ich eine kleine Änderung an Ihrem Code vorgenommen habe.

namespace WpfApplication2
{
    /// 
    /// Interaktionslogik für View.xaml
    /// 
    public partial class View : UserControl
    {
        public override void OnApplyTemplate()
        {
            MessageBox.Show(this.GetType().ToString());
            base.OnApplyTemplate();
        }
    }
}

Ich habe es als teilweise Klasse markiert, anstatt nur Klasse, da das XAML offensichtlich aus der .cs-Datei herausgezogen ist. Ich würde jedoch nicht denken, dass dies das Problem ist.

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