2009-09-23 12 views
9

Disons que j'ai une grille, dans ma grille j'ai un certain nombre de contrôles. Au lieu de définir la marge pour chacun de ces contrôles, je souhaite créer un style pour définir la marge pour tout contrôle que je laisse tomber dans une grille. Est-ce possible?Application de styles WPF aux éléments enfants

J'espérais que les éléments suivants travailleraient:

<Window.Resources> 
    <Style x:Key="DefaultMargins"> 
     <Setter Property="Control.Margin" Value="3, 3, 3, 3"/> 
     <Setter Property="Control.FontSize" Value="50"/> 
    </Style> 
</Window.Resources> 
<Grid Style="{StaticResource DefaultMargins}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="3*"/> 
     <ColumnDefinition Width="3*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="3*"/> 
     <RowDefinition Height="3*"/> 
    </Grid.RowDefinitions> 
    <Button Grid.Row="0" Grid.Column="0" Name="button1">Button</Button> 
</Grid> 

Mais la marge est ignorée, elle ne supportant pas l'héritage de la valeur de la propriété. Existe-t-il une alternative simple pour appliquer les marges à chaque «enfant» de la grille? Je comprends qu'il est possible de réaliser ce genre de chose en CSS et certains de nos développeurs sont intéressés à utiliser ce genre de construction.

Merci Ian

+0

Avez-vous trouvé une réponse à cette question? Je demande parce que j'ai le même problème. –

Répondre

1

Cela semble répondre à une question semblable à la vôtre: Apply style to all TreeViewItem

Si cela ne fonctionne pas alors je ne suis pas trop sûr de la façon dont il serait fait en XAML, mais vous pourrait ajouter le style dans le code-behind avec:

Control element; 

for (int i = 0; i < Grid1.Children.Count; i++) 
{ 
    element = (Control) Grid1.Children[i]; 
    element.Style = (Style) FindResource("DefaultMargins"); 
} 

Edit: Grid1 fait référence à la hache: Name = "Grid1" propriété ajoutée à la grille XAML (mauvaise dénomination que je sais).

4

Vous pouvez spécifier le style par type et contraindre à la portée de la Grid:

<Grid> 
<Grid.Resources> 
    <Style TargetType="{x:Type Control}"> 
     <Setter Property="Control.Margin" Value="3, 3, 3, 3"/> 
     <Setter Property="Control.FontSize" Value="50"/> 
    </Style> 
</Grid.Resources> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="3*"/> 
    <ColumnDefinition Width="3*"/> 
</Grid.ColumnDefinitions> 
<Grid.RowDefinitions> 
    <RowDefinition Height="3*"/> 
    <RowDefinition Height="3*"/> 
</Grid.RowDefinitions> 
<Button Grid.Row="0" Grid.Column="0" Name="button1">Button</Button> 

+0

Cela s'appliquera cependant aussi aux enfants d'enfants et ainsi de suite. Voir ma réponse ci-dessous pour la solution exacte en utilisant 'ItemsControl.ItemContainerStyle'. –

+0

J'ai essayé votre code, mais je n'ai pas réussi à le faire fonctionner. Après avoir creusé plus profondément, j'ai constaté que WPF n'applique pas de style à un contrôle lorsque la propriété TargetType de ce style est définie sur la classe de base de ce contrôle. http://stackoverflow.com/questions/1026635/setting-a-styles-targettype-property-to-a-base-class – addy689

+0

Cela avait l'habitude de fonctionner. Je ne poste pas de code que je ne cuisine pas pour chien. – Jordan

0

place éléments à l'intérieur ItemsControl avec ItemsPanel ensemble à Grid et ItemContainerStyle à votre style:

<Window.Resources> 
    <Style x:Key="DefaultMargins"> 
    <Setter Property="Control.Margin" 
      Value="3, 3, 3, 3" /> 
    <Setter Property="Control.FontSize" 
      Value="50" /> 
    </Style> 
</Window.Resources> 
<ItemsControl ItemContainerStyle="{StaticResource DefaultMargins}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="3*" /> 
      <ColumnDefinition Width="3*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="3*" /> 
      <RowDefinition Height="3*" /> 
     </Grid.RowDefinitions> 
     </Grid> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <Button Grid.Row="0" 
      Grid.Column="0" 
      Name="button1">Button</Button> 

</ItemsControl> 

Ceci a un inconvénient de ne pas bien fonctionner avec le concepteur.

+0

cela semble être exactement ce que je cherchais. Si je reviens plus tard, essayez-le et ça fonctionne, alors je vais upvote. – Maslow

Questions connexes