Pergunta

Tenho problemas com classes base no WPF. Eu tento fazer uma classe base com alguns elementos básicos, para que outras janelas possam herdar esses componentes. Mas tudo o que tenho, quando herdei a classe base, é apenas uma janela vazia, sem esses elementos. Para uma melhor compreensão, coloquei meu código aqui:

using XSoftArt.WPFengine;

namespace XSoftArt
{

    public class WindowBase : Window
    {

    public WindowBase()
    {

    }

}

Código do Windows, Whitch herda Windowbase:

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

        }
    }
}

Ou talvez alguém possa colocar um exemplo de trabalho ou link com classes base implementadas no WPF? Obrigado

Foi útil?

Solução

Acho que nunca usaria a herança no WPF da maneira como você está tentando usá -la.

Vou tentar fazer uma facada para responder à sua pergunta. Se estou entendendo você corretamente, você está tentando algo assim:

  1. Você está criando uma janela que possui um arquivo XAML e um código-behind.
  2. Você está adicionando "elementos básicos" ao XAML para sua janela ... Não tenho certeza do que você quer dizer com "elemento base", mas vou assumir que você quer dizer que está adicionando elementos da interface do usuário à sua janela.
  3. Você está criando outra janela que "deriva" da sua primeira janela no código-behind, e o problema é que você não está vendo os elementos da interface do usuário da sua janela "base".

Se é isso que você deseja realizar com o WPF, eu o recomendo pessoalmente, apenas porque pessoalmente não sou fã de herança e vi em primeira mão os perigos de deixar a herança sair do controle.

O que você poderia tentar é organizar seus elementos de interface do usuário "base" nos WPF UserControls. Este tutorial pode ser capaz de guiá -lo na direção certa. Boa sorte!

Outras dicas

Eu não acho que você realmente precisa fazer o que está fazendo, mas é viável. Eu acho que você está apenas esquecendo de chamar o construtor da classe base.

using XSoftArt.WPFengine;

namespace XSoftArt
{

    public class WindowBase : Window
    {

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

        }

    }
}

Você também precisará fazer isso em suas aulas herdadas:

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

        }
    }
}

E se você também tiver uma visão definida pelo XAML, precisará garantir que sua visão é um Windowbase. Para fazer isso, mude isso:

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

Para isso:

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

Se você olhar para esta classe no refletor, verá que o construtor chama o método "Initialize ()" da classe Window, que define muitas coisas em movimento. Especificamente, parece se conectar ao despachante, que é a fila de trabalho para todos os eventos da interface do usuário.

Em particular, você deseja garantir que o método inicializEComponent () da classe base seja chamado - essa é a função que cria os controles que você definiu no XAML.

Fazer uma classe derivada é ótimo se você deseja herdar controles e comportamento, mas considere usar Modelos Para uma maneira mais flexível de gerenciar um conjunto comum de controles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top