2008-09-02 23 views
8

He decidido que todas mis páginas WPF necesitan registrar un evento enrutado. En lugar de incluir¿Cómo creo una página base en WPF?

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

En cada página, decidí crear una página base (denominada BasePage). Puse la línea de código anterior en mi página base y luego cambié algunas de mis otras páginas para derivarme de BasePage. No puedo conseguir más allá de este error:

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

¿Alguien sabe cómo crear una página mejor base cuando puedo poner los eventos, propiedades, métodos, etc que quiero ser capaz de utilizar desde cualquier página de WPF?

Respuesta

25

Así es como he hecho esto en mi proyecto actual.

Primero he definido una clase (como @Daren Thomas dijo - simplemente una vieja clase de C#, ningún archivo XAML asociado), así (y sí, esta es una clase real - mejor no preguntar):

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

Entonces crear una nueva página y cambiar su declaración a este XAML:

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

Así que lo declaran como PigFinderPage en el "mi" espacio de nombres. Los recursos accesibles en la página que necesita deben ser declarados usando una sintaxis similar:

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

Por último, cambie al código subyacente para esta nueva página, y cambiar su declaración de la clase para que se deriva de la clase personalizada en lugar que directamente desde la página, como este:

public partial class EarmarkSearchPage : PigFinderPage 

Recuerde mantenerlo como una clase parcial.

Eso está funcionando para mí: puedo definir un conjunto de propiedades y eventos personalizados en "PigFinderPage" y usarlos en todos los descendientes.

+0

¿Pero cómo compartes tus recursos de PigFinderPage entre todas tus páginas derivadas? Su ejemplo anterior parece implicar que los define en cada clase derivada 'XAML', en cuyo caso si desea declarar los recursos base una vez que tenga problemas sin copiar y pegar. – Schneider

+0

Ah sí. Cualquier recurso compartido que estoy usando en vivo externo a la página. Algunos en App.xaml, algunos en diccionarios de recursos que importo según sea necesario. –

+1

Dos cosas: termine la definición de Xaml con y cuando herede de otro ensamblado use: xmlns: my = "clr-namespace: Qaf.PigFM.WindowsClient; assembly = QafPigFM.WindowsClient.BasePages". No introduzca un espacio entre; y la etiqueta de ensamblaje, esto causará un proyecto no compilable. –

2

No estoy seguro de esto, pero mirando su error, trataría de definir la clase base con solo el código C# (.cs) - no cree uno con XAML, solo un archivo .cs estándar que amplía la clase de página WPF.

3

Además, eche un vistazo a Attached Events y vea si puede adjuntar su evento a cada página en su aplicación. Podría ser más fácil que una clase intermedia personalizada.

2

Here es un tutorial también! es bastante simple y fácil.

1

Pequeña actualización: Traté de hacerlo, y no funcionó. Él es lo que he cambiado para resolver el problema:

1.En muchos foros, leerá que las páginas secundarias deben heredar de una clase cs simple, sin XAML. Aunque funciona Yo heredo de una página XAML normal sin ningún problema.

2.He sustituido el siguiente código:

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

porque cuando tuve "clr-namespace" en lugar de "utilizar", el Intellisense podía reconocer PigFinderPage, pero no el compilador.

Cuestiones relacionadas