将 WPF 样式应用于子项

9
假设我有一个网格,在我的网格中有许多控件。我希望创建一个样式来为我放置在网格中的任何控件设置边距,而不是为每个控件都设置边距。这可行吗?
我希望以下内容能够起作用:
<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>

但是Margin被忽略了,它不支持属性值继承。是否有一种简单的替代方法来将Margin应用于网格的每个“子项”?我知道在CSS中可以实现这种类型的事情,我们的一些开发人员对使用这种构造很感兴趣。
谢谢 Ian

你找到答案了吗?我问这个问题是因为我也有同样的问题。 - Jonathan Allen
3个回答

7

您可以按类型指定样式,并将其限制在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>


这也将适用于子级及其后代。请查看我的下面的答案,了解使用 ItemsControl.ItemContainerStyle 的确切解决方案。 - Marcin Wisnicki
1
我尝试了你的代码,但无法使其工作。经过深入挖掘,我发现当样式的TargetType属性设置为该控件的基类时,WPF不会将样式应用于控件。 - addy689
这曾经是可行的。我不会发布我没有狗粮测试过的代码。 - Jordan

1

这似乎回答了一个类似于你的问题: 将样式应用于所有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" 属性(命名不太合适)。


0

将元素放置在ItemsControl中,其中ItemsPanel设置为Grid,并将ItemContainerStyle设置为您的样式:

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

这种方法的缺点是与设计师合作效果不佳。


这似乎正是我正在寻找的。如果我稍后回来,尝试它并且它有效,那么我会点赞。 - Maslow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接