Pregunta

He decidido que todas mis páginas WPF deben registrar un evento enrutado.En lugar de incluir

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

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

Error 12 'CTS.IDOCV7.BASEPAGE' no puede ser la raíz de un archivo XAML porque se definió usando XAML.Línea 1 Posición 22.C:\Work\iDoc7\CTS.iDocV7\UI\Quality\QualityControlQueuePage.xaml 1 22 CTS.iDocV7

¿Alguien sabe cuál es la mejor manera de crear una página base cuando puedo colocar eventos, propiedades, métodos, etc. que quiero poder usar desde cualquier página WPF?

¿Fue útil?

Solución

Así es como hice esto en mi proyecto actual.

Primero, definí una clase (como dijo @Daren Thomas, solo una clase antigua de C#, sin archivo XAML asociado), como esta (y sí, esta es una clase real; es mejor no preguntar):

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

Luego creo una nueva página y cambio su declaración XAML a esto:

<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 declaro como PigFinderPage en el espacio de nombres "mi".Todos los recursos de toda la página que necesite deben declararse utilizando una sintaxis similar:

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

Por último, cambie al código subyacente de esta nueva página y cambie su declaración de clase para que derive de su clase personalizada en lugar de directamente de la página, así:

public partial class EarmarkSearchPage : PigFinderPage

Recuerda mantenerla como una clase parcial.

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

Otros consejos

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

No estoy seguro de esto, pero al observar su error, intentaría definir la clase base solo con código c# (.cs); no cree una con XAML, solo un archivo .cs estándar que extienda la página WPF. clase.

Aquí ¡También es un tutorial!es bastante simple y fácil.

Pequeña actualización:Intenté hacerlo y no funcionó.Él es lo que cambié para resolver el problema:

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

2.Reemplacé 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 tenía "clr-namespace" en lugar de "using", Intellisense podía reconocer PigFinderPage, pero no el compilador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top