2009-09-23 20 views
9

Sagen wir, ich habe ein Raster, in meinem Raster habe ich eine Reihe von Steuerelementen. Anstatt den Rand für jedes dieser Steuerelemente festzulegen, möchte ich einen Stil erstellen, um den Rand für JEDES Steuerelement festzulegen, das ich in einem Raster ablege. Ist das möglich?Anwenden von WPF-Stilen auf untergeordnete Elemente

Ich hatte gehofft, dass die folgenden funktionieren würde:

<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> 

Aber die Margin wird ignoriert, es Vererbung von Eigenschaftswerten nicht unterstützt. Gibt es eine einfache Alternative, um die Ränder auf jedes "Kind" des Rasters anzuwenden? Ich verstehe, dass es möglich ist, solche Dinge in CSS zu erreichen, und einige unserer Entwickler sind daran interessiert, diese Art von Konstrukten zu verwenden.

Dank Ian

+0

Haben Sie eine Antwort darauf gefunden? Ich frage, weil ich das gleiche Problem habe. –

Antwort

1

Dies scheint eine ähnliche Frage zu Ihnen zu beantworten: Apply style to all TreeViewItem

Wenn das nicht dann über nicht sicher, ich bin nicht funktioniert, wie es in XAML getan hätte, aber Sie hinzufügen könnte den Stil in dem Code-behind mit:

Control element; 

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

Edit: Grid1 bezieht sich auf ax: Name = "Grid1" Eigenschaft auf das XAML Gitter hinzugefügt (schlechte Namensgebung ich weiß).

4

Sie können die Art von Typ angeben und beschränken es auf den Umfang des 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

Dies gilt jedoch auch für Kinder von Kindern und so weiter. Siehe meine Antwort unten für die genaue Lösung mit 'ItemsControl.ItemContainerStyle'. –

+0

Ich habe Ihren Code versucht, konnte ihn jedoch nicht zur Arbeit bringen. Nachdem ich tiefer gegangen bin, habe ich festgestellt, dass WPF keinen Stil auf ein Steuerelement anwendet, wenn die TargetType-Eigenschaft dieses Stils auf die Basisklasse dieses Steuerelements eingestellt ist. http://stackoverflow.com/questions/1026635/setting-a-styles-targettype-property-to-a-base-class – addy689

+0

Dies verwendet, um zu arbeiten. Ich poste keinen Code, dass ich kein Hundefutter habe. – Jordan

0

Platz Elemente innerhalb ItemsControl mit ItemsPanel Set Grid und ItemContainerStyle zu Ihrem Stil:

<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> 

Dies hat den Nachteil, nicht gut mit Designer zu arbeiten.

+0

das scheint genau das zu sein, wonach ich gesucht habe. Wenn ich später zurückkomme, probiere es aus und es funktioniert, dann werde ich upvote. – Maslow

Verwandte Themen