2009-10-15 7 views
2

Je usercontrols qui héritent d'une classe de base qui ressemble à ceci:Est-il possible d'hériter de XAML?

BasePage.cs:

using System.Windows.Controls; 

namespace TestPageManager23434 
{ 
    public class BasePage : UserControl 
    { 
     public string ButtonPreviousText { get; set; } 
     public string ButtonNextText { get; set; } 

     protected PageManager pageManager; 

     public BasePage(PageManager pageManager) 
     { 
      this.pageManager = pageManager; 
     } 
    } 
} 

et les contrôles utilisateur qui ressemblent à ceci:

XAML:

<local:BasePage x:Class="TestPageManager23434.Page1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:local="clr-namespace:TestPageManager23434" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Background="White" 
      Width="400" 
      Height="400"     
       > 
     <TextBlock Text="this is page1"/> 
     <TextBlock Text="{Binding Message}"/> 
     <Button Content="go to page 2" Click="Button_Click" 
       HorizontalAlignment="Left" 
       Width="200" 
       Height="30" 
       /> 
    </StackPanel> 
</local:BasePage> 

code Derrière:

using System.Windows.Controls; 

namespace TestPageManager23434 
{ 
    public partial class Page1 : BasePage 
    { 
     public string Message { get; set; } 

     public Page1(PageManager pageManager) : base(pageManager) 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

     private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
      pageManager.SwitchPage("page2"); 
     } 
    } 
} 

Mais maintenant dans mes portions XAML de mes différentes UserControls J'ai aussi blocs XAML que je voudrais également Hériter de la classe de base pour que je n'ai pas bloc copié dans chaque fichier XAML:

<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Left"> 
    <Button 
     Content="{Binding ButtonPreviousText}" 
     Width="150" 
     Margin="5" 
     Click="ButtonPrevious_Click"/> 
    <Button 
     Content="{Binding ButtonNextText}" 
     Width="150" 
     Click="ButtonNext_Click" Margin="5"/> 
</StackPanel> 

Mais depuis ma classe de base n'a pas XAML, je vois deux façons:

  • les créer dans le code dans ma classe de base
  • créer usercontrols pour les

Ou est-il une autre façon d'avoir cette XAML dans un endroit ou d'une certaine façon d'hériter XAML?

Répondre

4

Je suggère de lire le WPF Control Authoring Overview sur MSDN. Je ne pense pas que vous serez en mesure de réaliser ce que vous essayez de faire avec UserControls en particulier. UserControls est conçu pour coller un certain ensemble de contrôles de manière à ce qu'ils soient réutilisés de manière cohérente dans le cadre d'une seule application. Ils ne sont vraiment pas destinés à être hérités. Une chose que vous pouvez faire est de les utiliser dans une sorte de "MasterPage" (si vous êtes familier avec ASP.NET). Vous pouvez placer ContentControls dans UserControl "de base" et exposer différentes propriétés qui permettent aux autres d'injecter du contenu dans la disposition standard du contrôle de base. De cette façon, vos autres UserControl placent le UserControl "de base" en tant qu'élément racine à l'intérieur d'eux-mêmes et définissent les différentes propriétés du contenu selon les éléments qu'ils veulent.

+0

J'ai essayé d'éditer la faute de frappe: Authorizing -> Authoring mais il était à court un edit à commettre par moi. C'est une faute de frappe qui est un peu déroutant au début ... –

+0

@David Perlman, merci, corrigé! –

0

Eh bien vous pouvez écrire le xaml et ensuite utiliser le XamlReader pour analyser le xaml en objets, il vous donne les avantages d'écrire xml à la place du code.

0

Si tous vos contrôles ont des éléments communs, vous pouvez contrôler les éléments communs et les utiliser dans tous les autres contrôles utilisateur. Deuxièmement, je peux voir que vous avez une certaine logique métier dans l'élément commun, mais la manière d'écrire la logique métier est un peu plus ancienne, vous devriez envisager de créer des commandes et d'implémenter des commandes. Cela nécessitera un peu plus d'étude mais vous permettra de concevoir de plus gros projets facilement.

1

Dans votre exemple, il semble que vous seriez mieux servi en créant un contrôle appelé "NavigationControl", puis l'utiliser dans chacun de vos contrôles plutôt que de copier ce même bloc. Sans un peu plus de contexte et de spécificités, il est difficile de donner une bonne solution.