Pregunta

Tengo un problema con las clases base en WPF. Intento crear una clase base con algunos elementos básicos, para que otras ventanas puedan heredar estos componentes. Pero todo lo que tengo, cuando heredo la clase base, es solo una ventana vacía, sin estos elementos. Para una mejor comprensión puse mi código aquí:

using XSoftArt.WPFengine;

namespace XSoftArt
{

    public class WindowBase : Window
    {

    public WindowBase()
    {

    }

}

Código de Windows, que hereda WindowBase:

namespace XSoftArt.WPFengine
{
    public partial class NewAbility : WindowBase
    {
        public NewAbility()
        {
            base.ChildForm = this; InitializeComponent();

        }
    }
}

¿O tal vez alguien puede poner un ejemplo de trabajo o un enlace con las clases base implementadas en wpf? Gracias

¿Fue útil?

Solución

No creo que alguna vez use la herencia en WPF de la forma en que intentas usarla.

Trataré de intentar responder tu pregunta. Si te entiendo correctamente, estás intentando algo como esto:

  1. Estás creando una ventana que tiene un archivo XAML y un código subyacente.
  2. Está agregando " elementos básicos " al XAML para su ventana ... No estoy seguro de lo que quiere decir con "elemento base", pero voy a suponer que quiere decir que está agregando elementos de interfaz de usuario a su ventana.
  3. Estás creando otra ventana que '' deriva '' desde su primera ventana en el código subyacente, y el problema es que no está viendo los elementos de la interfaz de usuario desde su " base " ventana.

Si eso es lo que quieres lograr con WPF, personalmente lo recomendaría en contra de eso, solo porque personalmente no soy un fanático de la herencia y he visto de primera mano los peligros de dejar que la herencia se salga de control.

Lo que podría intentar en su lugar es organizar su " base " Elementos de la interfaz de usuario en WPF UserControls. Este tutorial podría guiarlo en la dirección correcta . ¡Buena suerte!

Otros consejos

No creo que realmente necesites hacer lo que estás haciendo, pero es factible. Creo que te estás olvidando de llamar al constructor de la clase base.

using XSoftArt.WPFengine;

namespace XSoftArt
{

    public class WindowBase : Window
    {

        //call base ctor
        public WindowBase() : base()
        {

        }

    }
}

También deberá hacer esto desde sus clases heredadas:

namespace XSoftArt.WPFengine
{
    public partial class NewAbility : WindowBase
    {
        public NewAbility() : base()
        {
            base.ChildForm = this; InitializeComponent();

        }
    }
}

Y si también tiene una vista definida por XAML, deberá asegurarse de que su vista es una WindowBase. Para hacer esto, cambie esto:

<Window x:Class="MyApp.MyView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  ...
  >
  <Grid>        
  </Grid>
</Window>

A esto:

<local:WindowBase x:Class="MyApp.MyView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:XSoftArt;"
  ...
  >
  <Grid>        
  </Grid>
</local:WindowBase>

Si observa esta clase en Reflector, verá que el constructor llama a la clase Window '' Initialize () '' método, que pone muchas cosas en movimiento. Específicamente, parece conectarse al Dispatcher, que es la cola de trabajo para todos los eventos de IU.

En particular, desea asegurarse de que se llame al método InitializeComponent () de la clase base: esta es la función que crea los controles que definió en XAML.

Crear una clase derivada es excelente si desea heredar tanto los controles como el comportamiento, pero considere usar Plantillas para una forma más flexible de administrar un conjunto común de controles.

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