将WPF样式应用于子项

时间:2009-09-23 12:55:46

标签: wpf grid styles

假设我有一个网格,在我的网格中我有很多控件。我希望创建一个样式来设置任何控件的边距,而不是为每个控件设置边距。这可能吗?

我希望以下内容能够奏效:

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

但保证金被忽略,它不支持财产价值继承。是否有一个简单的替代方法将边距应用于网格的每个“子”?我理解在CSS中可以实现这种功能,而且我们的一些开发人员对使用这种构造感兴趣。

由于 伊恩

3 个答案:

答案 0 :(得分:5)

您可以按类型指定样式,并将其约束到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>

答案 1 :(得分:1)

这似乎回答了与您类似的问题: Apply style to all TreeViewItem

如果这不起作用,那么我不太清楚如何在XAML中完成它,但你可以在代码隐藏中添加样式:

Control element;

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

编辑:Grid1引用添加到XAML网格的x:Name =“Grid1”属性(我知道命名不佳)。

答案 2 :(得分:0)

ItemsControl内的元素放在ItemsPanel设置为GridItemContainerStyle的样式中

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

这有一个缺点,就是与设计师不能很好地合作。