Come posso creare una pagina di base in WPF?
Domanda
Ho deciso che tutte le mie pagine WPF devono registrare un evento indirizzato.Piuttosto che includere
public static readonly RoutedEvent MyEvent= EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(BasePage));
su ogni pagina, ho deciso di creare una pagina base (denominata BasePage).Ho inserito la riga di codice sopra nella mia pagina di base e poi ho modificato alcune delle mie altre pagine per derivare da BasePage.Non riesco a superare questo errore:
Errore 12 'cts.idocv7.basepage' non può essere la radice di un file XAML perché è stato definito usando XAML.Linea 1 Posizione 22.C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7
Qualcuno sa come creare al meglio una pagina di base quando posso inserire eventi, proprietà, metodi, ecc. che voglio poter utilizzare da qualsiasi pagina WPF?
Soluzione
Ecco come l'ho fatto nel mio progetto attuale.
Per prima cosa ho definito una classe (come ha detto @Daren Thomas - solo una semplice vecchia classe C#, nessun file XAML associato), come questa (e sì, questa è una vera classe - è meglio non chiedere):
public class PigFinderPage : Page
{
/* add custom events and properties here */
}
Quindi creo una nuova pagina e modifico la sua dichiarazione XAML in questa:
<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"
/>
Quindi lo dichiaro come PigFinderPage nello spazio dei nomi "mio".Qualsiasi risorsa a livello di pagina di cui hai bisogno deve essere dichiarata utilizzando una sintassi simile:
<my:PigFinderPage.Resources>
<!-- your resources go here -->
</my:PigFinderPage.Resources>
Infine, passa al code-behind per questa nuova pagina e modifica la sua dichiarazione di classe in modo che derivi dalla tua classe personalizzata anziché direttamente da Page, in questo modo:
public partial class EarmarkSearchPage : PigFinderPage
Ricordarsi di mantenerlo come classe parziale.
Per me funziona a meraviglia: posso definire una serie di proprietà ed eventi personalizzati in "PigFinderPage" e usarli in tutti i discendenti.
Altri suggerimenti
Inoltre, dai un'occhiata Eventi allegati e vedi se riesci ad allegare il tuo evento a ogni pagina della tua app.Potrebbe essere più semplice di una lezione intermedia personalizzata.
Non ne sono sicuro, ma guardando il tuo errore, proverei a definire la classe base solo con codice C# (.cs): non crearne una con XAML, solo un file .cs standard che estende la pagina WPF classe.
Qui è anche un tutorial!è piuttosto semplice e facile.
Piccolo aggiornamento:Ho appena provato a farlo e non ha funzionato.Lui è quello che ho cambiato per risolvere il problema:
1.In molti forum leggerai che le sottopagine devono ereditare da una semplice classe cs, senza XAML.Anche se funziona.Eredito da una normale pagina XAML senza alcun problema.
2.Ho sostituito il seguente codice:
<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"
/>
con
<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"
/>
perché quando avevo "clr-namespace" invece di "using", Intellisense poteva riconoscere PigFinderPage, ma non il compilatore.