Verständnis WPF-Fenster-Klasse ableiten
Ich bin sicher, dies ist einfach, aber neu für mich für WPF mit C#. Ich weiß zum Erben von Klassen und getan haben so viele Male, wie in C# WinForms Projekte...
public class MyClass : DerivedFromClass
{}
Allerdings ratlos in WPF und hier ist das Problem. Ich will bauen meine eigenen Satz von Steuerelementen verwendet werden, die als Basis für eine neue Lern-Projekt... voreingestellten meine eigenen Stile, Farben, Hintergründe und andere Funktionen. Kein problem. Starten Sie zunächst mit einem WPF-Fenster, und erstellen "MyWindow".
Nun, ich möchte an dieser baseline "MyWindow" und eine Unterklasse, DIE für noch eine andere Klasse von MySubClassedWindow. Also erstelle ich eine neue Fenster-Klasse, und standardmäßig, VS2010 erstellt die beiden designer und code-Teile der form. Ich mache auf code anzeigen MySubClassedWindow und finden
partial class MySubclassedWindow : Window
{}
In C# mit WinForms, ich würde nur ändern (und ich habe die class library reference, enthält die "MyWindow" Erklärung.
partial class MySubclassedWindow : MyWindow
{}
Wenn ich das mache, bekomme ich einen Kompilierungsfehler von
Partial declarations of 'MyNameSpace.MySubclassedWindow' must not specify different base classes
InformationsquelleAutor DRapp | 2011-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Basis-Klasse sollte nur eine class-Datei (keine
Window
).So erstellen WindowBase.cs
Im Hauptfenster (zum Beispiel) ändern Sie in der xaml-Code.cs-Datei zu Erben von WindowBase statt
Im Hauptfenster.xaml namespace enthalten für WindowBase und Fenster zur änderung Basis:WindowBase wie diese
Vergessen Sie nicht, fügen Sie
FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata(TryFindResource(typeof(Window))));
in Sie AppStartup Veranstaltung. Ansonsten wird Ihr abgeleiteten Klassen werden Sie verwenden keine Standard-Fenster-StileSchöner blog-post-link von einer anderen, ähnlichen Frage - Erstellung eines Basis-Fenster-Klasse in WPF
Thx Fredrik 😉 gute Antwort.
Dank Fredrik, sehr hilfreich für eine WPF-Anfänger wie mich.
InformationsquelleAutor Fredrik Hedblad
Mit einer base Window-Klasse bringt einen kritischen Nachteil, nämlich, dass die Bindung an Eigenschaften in Ihre Basis-Klasse ist viel schwieriger zu tun, (und die momentan akzeptierte Antwort löst nicht das problem). Was ist der Punkt zu Erben, wenn Sie nicht auf base-Eigenschaften? Ich habe herausgefunden, wie diese einzustellen ist, nach einigen langen Stunden, und wollte zu teilen, in der Hoffnung, dass andere verschont werden diese Schmerzen.
Müssen Sie möglicherweise verwenden Sie Dinge wie Wert-Wandlern, die nur referenziert werden, über statische Bindung, die in meinem Fall Sinn gemacht zu haben, in der WindowBase Klasse. Beigefügt habe ich ein Beispiel, weil ich fand es schwierig, die Verwendung dieser Konverter konsequent im design-und run-Modus.
Können Sie nicht einstellen, das x:Name-property von diesem geerbt Fenster über XAML, aber Sie können nicht so tun müssen, wenn unter den unten angegebenen Vorgehensweise. Beigefügt habe ich ein Beispiel, wie der name, weil Erben von Fenster wird Ihnen nicht erlauben, um den Namen zur design-Zeit, in der Unterklasse. Ich empfehle nicht, sich auf den Namen des Fensters zur design-Zeit, aber die Einstellung d:DataContext kümmern sollte und keine verbindlichen Anforderungen für Sie.
Gewarnt werden, die im design-Modus, aber nicht im run-Modus, wird eine Kopie von WindowBase (oder die angegebene Klasse in d:DataContext) instanziiert werden im design-Modus und dient als verbindlicher Rahmen. Also in ganz bestimmten Fällen sehen Sie möglicherweise Daten Abweichungen, aber in der überwiegenden Mehrzahl der Anwendungsfälle ist dieser Ansatz sollte ausreichen.
WindowBase.cs
``
SubClassWindow.xaml
Nichts ist erforderlich in der SubClassWindow code-behind-auch nicht durch einen Konstruktor).
InformationsquelleAutor nuzzolilo