2010-10-20 16 views
5

J'ai un problème avec l'héritage de contrôle dans WPF. J'ai créé un UserControl nommé BaseUserControl. Je veux que ce contrôle soit un contrôle de base pour les autres userControls WPF. J'ai donc écrit un autre UserControl appelé FirstComponent. À l'étape suivante, j'ai changé ce codewpf - UserControl inheritance

FirstComponent : UserControl 

à cette

FirstComponent : BaseControl 

Cependant lors de la compilation que je reçois cette erreur

Partial declarations of 'controlinheritance.componenets.FirstComponent' must not specify different base classes 

Que dois-je faire pour permettre FirstComponent tirer de BaseControl?

EDIT Grâce à la réponse abhishek j'ai réussi à hériter des contrôles. Howerver j'ai une autre question. Dans la classe de base j'ai spécifié une propriété public Grid _MainGrid {get; ensemble; } Maintenant, je veux dans ma classe dérivée créer une instance de cette grille. J'ai donc utilisé ce code Comment j'obtiens une erreur La propriété '_MainGrid' n'a pas de valeur. Ligne 8 Position 36.

Répondre

5

Avez-vous vu mon article complet à ce sujet?

http://www.dotnetfunda.com/articles/article832-define-base-class-for-window--usercontrol-.aspx

J'espère que cela vous aidera dans ce domaine.

Si vous essayez d'exécuter le projet, il serait certainement jeter l'erreur à vous. Cela est dû au fait que chaque fenêtre WPF est créée à partir de la mise en page baseWindow plutôt que de la disposition de fenêtre actuelle. En d'autres termes, si vous voyez le code XAML, vous verrez que la balise racine est Window, qui est une classe juste parent de la fenêtre en cours.

Ainsi, pour que tout fonctionne parfaitement, nous devons changer l'élément racine .

Il ressemblerait à ceci:

<local:BaseWindow Class="BaseWindowSample.Window1" 
        Name="winImp" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:BaseWindowSample" 
        Title="Window1"> 
... 
</local:BaseWindow> 

Si vous voyez ce minutieusement, vous pouvez voir que j'ai ajouté un espace de noms à mon projet et nommé comme local. Alors BaseWindow devrait provenir de BaseWindow et donc il va comme local: BaseWindow

+0

Merci, il m'a beaucoup aidé . Pourriez-vous regarder mon message édigté – Berial

0

Eh bien la raison de l'erreur initiale était parce que la classe était en fait une classe partielle qui gîtait un héritage de base particulière ailleurs, en plus de la l'endroit où vous avez changé votre classe de base.

En ce qui concerne votre propriété « héritage », je vous conseille d'essayer

public Grid MainGrid 
{ 
    get 
    { 
     return base.MainGrid; 
    } 

    set 
    { 
     base.MainGrid = value; 
    } 
} 

Cependant, je dois souligner que cela ne vous donnera pas un lien vers une instance existante (s) de votre classe de base. Si vous voulez qu'il y ait un lien garanti dans votre classe dérivée vers l'instance solitaire de cette grille, alors vous devrez rendre statique la propriété de la classe de base. Dans ce cas, votre code ressemblera à ceci ...

public Grid MainGrid 
{ 
    get 
    { 
     return BaseControl.MainGrid; 
    } 

    set 
    { 
     BaseControl.MainGrid = value; 
    } 
} 
0

Lorsque vous spécifiez une classe de base différente pour un Usercontrol dans le fichier XAML.cs

FirstComponent : BaseControl 

Vous devez également modifier dans le XAML

<Base:BaseControl x:Class="FirstComponent" 
      xmlns:Base="clr-namespace:MyApplication.Base" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 


    </Grid> 
</Base:BaseControl>