Frage

Ich habe entschieden, dass alle meine WPF-Seiten ein Routing-Ereignis registrieren müssen.Anstatt einzubeziehen

public static readonly RoutedEvent MyEvent= EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(BasePage));

Auf jeder Seite habe ich beschlossen, eine Basisseite (mit dem Namen BasePage) zu erstellen.Ich habe die obige Codezeile in meine Basisseite eingefügt und dann einige meiner anderen Seiten so geändert, dass sie von BasePage abgeleitet sind.Ich komme über diesen Fehler nicht hinweg:

Fehler 12 'cts.idocv7.basepage' kann nicht das Root einer XAML -Datei sein, da sie mit XAML definiert wurde.Zeile 1 Position 22.C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7

Weiß jemand, wie man am besten eine Basisseite erstellt, wenn ich Ereignisse, Eigenschaften, Methoden usw. einfügen kann, die ich von jeder WPF-Seite aus verwenden möchte?

War es hilfreich?

Lösung

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), wie diese (und ja, das ist eine echte Klasse – am besten nicht fragen):

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

Dann erstelle ich eine neue Seite und ändere ihre XAML-Deklaration wie folgt:

<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"
    />

Also deklariere ich es als PigFinderPage im „mein“ Namespace.Alle seitenweiten Ressourcen, die Sie benötigen, müssen mit einer ähnlichen Syntax deklariert werden:

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

Wechseln Sie abschließend zum Code-Behind für diese neue Seite und ändern Sie die Klassendeklaration so, dass sie von Ihrer benutzerdefinierten Klasse und nicht direkt von der Seite abgeleitet wird, wie folgt:

public partial class EarmarkSearchPage : PigFinderPage

Denken Sie daran, es als Teilklasse beizubehalten.

Das ist für mich ein Vergnügen – ich kann eine Reihe benutzerdefinierter Eigenschaften und Ereignisse in „PigFinderPage“ definieren und sie in allen Nachkommen verwenden.

Andere Tipps

Schauen Sie sich auch um Angehängte Ereignisse und prüfen Sie, ob Sie Ihr Ereignis an jede Seite in Ihrer App anhängen können.Könnte einfacher sein als eine benutzerdefinierte Zwischenklasse.

Da bin ich mir nicht sicher, aber angesichts Ihres Fehlers würde ich versuchen, die Basisklasse nur mit C#-Code (.cs) zu definieren. Erstellen Sie keine mit XAML, sondern nur eine Standard-CS-Datei, die die WPF-Seite erweitert Klasse.

Hier ist auch ein Tutorial!es ist ziemlich einfach und leicht.

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

1.In vielen Foren wird man lesen, dass die Unterseiten von einer einfachen CS-Klasse erben müssen, ohne XAML.Obwohl es funktioniert.Ich erbe problemlos von einer normalen XAML-Seite.

2.Ich habe den folgenden Code ersetzt:

<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“ hatte, konnte Intellisense PigFinderPage erkennen, aber nicht den Compiler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top