2008-09-02 21 views
8

Ich habe beschlossen, dass alle meine WPF-Seiten ein Routingereignis registrieren müssen. Anstatt auf jeder SeiteWie erstelle ich eine Basisseite in WPF?

aufzunehmen, entschied ich mich, eine Basisseite (namens BasePage) zu erstellen. Ich legte die obige Codezeile in meine Basisseite und änderte dann einige meiner anderen Seiten, um von BasePage abzuleiten. Ich kann nicht nach diesem Fehler erhalten:

Error 12 'CTS.iDocV7.BasePage' cannot be the root of a XAML file because it was defined using XAML. Line 1 Position 22. C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7

Weiß jemand, wie man am besten eine Basisseite erstellen, wenn ich Ereignisse setzen kann, Eigenschaften, Methoden, etc., die ich von jeder wpf Seite zu verwenden, um der Lage sein soll?

Antwort

25

So habe ich das in meinem aktuellen Projekt gemacht.

Zuerst habe ich eine Klasse definiert (wie @Daren Thomas sagte - nur eine einfache alte C# -Klasse, keine zugehörige XAML-Datei), so (und ja, das ist eine echte Klasse - am besten nicht zu fragen):

public class PigFinderPage : Page 
{ 
    /* add custom events and properties here */ 
} 

Dann erstelle ich eine neue Seite und ändern diese ihre XAML-Deklaration:

<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:my="clr-namespace:Qaf.PigFM.WindowsClient" 
    /> 

so erkläre ich es als PigFinderPage in der "my" Namespace. Jegliche Seite weite Ressourcen, die Sie benötigen, müssen deklariert werden, um eine ähnliche Syntax:

<my:PigFinderPage.Resources> 
    <!-- your resources go here --> 
</my:PigFinderPage.Resources> 

Schließlich Schalter in dem Code-Behind für diese neue Seite, und seine Klassendeklaration ändern, so dass es aus Ihrer benutzerdefinierten Klasse abgeleitet eher als direkt von Seite, wie folgt:

public partial class EarmarkSearchPage : PigFinderPage 

Denken Sie daran, es als eine partielle Klasse zu halten.

Das funktioniert ein Vergnügen für mich - ich kann eine Reihe von benutzerdefinierten Eigenschaften und Ereignisse wieder in "PigFinderPage" definieren und sie in allen Nachkommen verwenden.

+0

Wie aber teilen Sie Ihre PigFinderPage-Ressourcen zwischen all Ihren abgeleiteten Seiten? Das obige Beispiel scheint zu implizieren, dass Sie sie in jeder XAML-Klasse der abgeleiteten Klasse definieren. In diesem Fall müssen Sie die Basisressourcen deklarieren, sobald Sie Schwierigkeiten haben, ohne sie kopieren und einfügen zu müssen. – Schneider

+0

Ah ja. Alle freigegebenen Ressourcen, die ich verwende, befinden sich außerhalb der Seite. Einige in App.xaml, einige in Ressourcen-Wörterbüchern, die ich nach Bedarf importiere. –

+1

Zwei Dinge: Beenden Sie die Xaml-Definition mit und verwenden Sie beim Erben von einer anderen Assembly: xmlns: my = "clr-namespace: Qaf.PigFM.WindowsClient; assembly = QafPigFM.WindowsClient.BasePages". Stellen Sie keinen Abstand zwischen; und das Assembly-Tag verursacht ein unkompilierbares Projekt. –

2

Ich bin mir nicht sicher, aber bei Ihrem Fehler würde ich versuchen, die Basisklasse mit nur C# (.cs) -Code zu definieren - erstellen Sie keine mit XAML, nur eine Standard-CS-Datei, die erweitert die WPF-Seitenklasse.

3

Schauen Sie sich auch Attached Events an und sehen Sie, ob Sie Ihre Veranstaltung an jede Seite in Ihrer App anhängen können. Könnte einfacher sein als eine benutzerdefinierte Zwischenklasse.

2

Here ist ein Tutorial auch! ist es ziemlich einfach und einfach.

1

Kleines Update: Ich habe gerade versucht, es zu tun, und es hat nicht funktioniert. Er ist, was ich änderte, um das Problem zu lösen:

1.In vielen Foren lesen Sie, dass die Unterseiten von einer einfachen cs-Klasse ohne XAML erben müssen. Obwohl es funktioniert. Ich erben von einer normalen XAML-Seite ohne jedes Problem.

2.Ich ersetzen den folgenden Code:

<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:my="clr-namespace:Qaf.PigFM.WindowsClient" 
/> 

mit

<my:PigFinderPage x:Class="Qaf.PigFM.WindowsClient.PenSearchPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:my="using:Qaf.PigFM.WindowsClient" 
/> 

, denn wenn ich "clr-namespace" anstelle von "using" habe, der Intellisense PigFinderPage erkennen kann, aber nicht den Compiler.

Verwandte Themen