2017-03-07 2 views
2

J'ai créé un contrôle personnalisé appelé « Champ », héritant de ContentControl et qui contient un Grid et un label pour exposer l'étiquette sur le terrain, et un ContentPresenter pour permettre de mettre un contrôle en fonction sur les données que nous voulons éditer.WPF contrôle des enfants, le style seulement une partie du contenu

Puis j'ai créé un contrôle personnalisé appelé "TextField", qui hérite de Field, qui devrait mettre un TextBox dans le contenu.

Voici les styles generic.xaml:

<Style TargetType="{x:Type controls:Field}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:Field}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <Grid x:Name="grd" Margin="3px"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="{Binding Path=LabelLength, RelativeSource={RelativeSource AncestorType=Control}}" /> 
          <ColumnDefinition Width="{Binding Path=ContentLength, RelativeSource={RelativeSource AncestorType=Control}}" /> 
         </Grid.ColumnDefinitions> 
         <Label Grid.Column="0" Content="{Binding Path=Label, RelativeSource={RelativeSource AncestorType=Control}}" /> 
         <ContentPresenter Grid.Column="1" Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}" /> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="{x:Type controls:FieldText}" BasedOn="{StaticResource {x:Type controls:Field}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:FieldText}"> 
       <TextBox Grid.Column="1" MaxLines="1" TextWrapping="NoWrap" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

En preuve, cela montre seulement une zone de texte lors de l'utilisation d'un TextField. Mais comment puis-je simplement styliser le contenu (par exemple le TextBox dans cet exemple) en laissant le reste du contrôle hériter du style parent?

Je sais que je pourrais réécrire tout le contrôle pour chaque contrôle dérivé, mais c'est contre les principes de l'héritage, non? Signifierait le code dupliqué (balisage dupliqué ici) et si je change quelque chose dans le parent "Field" je devrais le changer dans chaque contrôle enfant, avec le risque d'erreurs ...

+0

Vous vous dites à mettre en TextBox contenu, mais vous mettez cela en modèle tout écraser. – Evk

Répondre

0

Définir la propriété Content du parent le contrôle à une instance d'un TextBox que vous pouvez définir le style mais vous voulez:

<controls:Field Background="Gray"> 
    <TextBox Grid.Column="1" MaxLines="1" TextWrapping="NoWrap" /> 
</controls:Field> 

Voilà comment un ContentControl est censé être utilisé.

Vous ne pouvez pas override seulement une partie d'un ControlTemplate:

WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?