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 ...
Vous vous dites à mettre en TextBox contenu, mais vous mettez cela en modèle tout écraser. – Evk