Question

J'ai un problème avec les classes de base dans WPF. J'essaie de créer une classe de base avec certains éléments de base, afin que d'autres fenêtres puissent hériter de ces composants. Mais tout ce que j'ai, quand j'hérite de la classe de base, c'est seulement une fenêtre vide, sans ces éléments. Pour une meilleure compréhension, je mets mon code ici:

using XSoftArt.WPFengine;

namespace XSoftArt
{

    public class WindowBase : Window
    {

    public WindowBase()
    {

    }

}

Code de Windows qui hérite de WindowBase:

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

        }
    }
}

Ou peut-être que quelqu'un peut mettre un exemple de travail ou un lien avec les classes de base implémentées dans wpf? Merci

Était-ce utile?

La solution

Je ne pense pas que j'utiliserais jamais l'héritage dans WPF de la façon dont vous essayez de l'utiliser.

Je vais essayer de répondre à votre question. Si je vous comprends bien, vous essayez quelque chose comme ceci:

  1. Vous créez une fenêtre contenant à la fois un fichier XAML et un code-behind.
  2. vous ajoutez des "éléments de base". vers le XAML pour votre fenêtre ... Je ne sais pas ce que vous entendez par "élément de base", mais je vais supposer que vous voulez dire que vous ajoutez des éléments d'interface utilisateur à votre fenêtre.
  3. Vous créez une autre fenêtre qui "dérive". depuis votre première fenêtre dans le code-behind, et le problème est que vous ne voyez pas les éléments de l'interface utilisateur dessus depuis votre "base". fenêtre.

Si c’est ce que vous voulez accomplir avec WPF, je vous le déconseille personnellement, tout simplement parce que je ne suis personnellement pas un fan de l’héritage et que j’ai vu de mes propres yeux les dangers de laisser l’héritage l’échapper.

Vous pouvez plutôt essayer d'organiser votre "base". Éléments d'interface utilisateur dans WPF UserControls. Ce tutoriel peut vous guider dans le bon sens . Bonne chance!

Autres conseils

Je ne pense pas que vous ayez vraiment besoin de faire ce que vous faites, mais c'est faisable. Je pense que vous oubliez simplement d'appeler le constructeur de la classe de base.

using XSoftArt.WPFengine;

namespace XSoftArt
{

    public class WindowBase : Window
    {

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

        }

    }
}

Vous devrez également le faire à partir de vos classes héritées:

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

        }
    }
}

Et si vous avez également une vue définie par XAML, vous devez vous assurer que votre vue est un WindowBase. Pour ce faire, changez ceci:

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

À ceci:

<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 vous regardez cette classe dans Reflector, vous verrez que le constructeur appelle les propres "Initialize ()" de la classe Window. méthode, qui met beaucoup de choses en mouvement. Plus précisément, il semble se connecter au Dispatcher, qui est la file d'attente de travail pour tous les événements d'interface utilisateur.

En particulier, vous voulez vous assurer que la méthode InitializeComponent () de la classe de base est appelée - il s'agit de la fonction qui crée les contrôles que vous avez définis dans XAML.

Il est intéressant de créer une classe dérivée si vous souhaitez hériter des contrôles et du comportement, mais envisagez d'utiliser Modèles pour une méthode plus souple de gestion d’un ensemble commun de contrôles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top