设置WPF布局网格背景的样式(每个单元格、行、列)

设置WPF布局网格背景的样式(每个单元格、行、列),wpf,xaml,grid,styles,controltemplates,Wpf,Xaml,Grid,Styles,Controltemplates,我想知道是否有任何方法可以设置WPF布局网格的单元格、行和列的样式。我一直在努力寻找任何信息,我发现很少有人提及我的信息 我想样式的网格看起来像一个在链接的屏幕截图 如果实际控件不支持它,我是否可以以某种方式继承它,然后执行它?我是WPF的新手,因此非常感谢您的帮助 还有一件事,我知道我可以对网格中的每个控件进行样式化,但这似乎有些过头了。我想有一个网格,它自己做 WPF网格本身没有可见的单元格。可以将它们视为不可见的网格线,子元素可以与之对齐 因此,要设置网格单元格的样式,必须设置网格内对齐的

我想知道是否有任何方法可以设置WPF布局网格的单元格、行和列的样式。我一直在努力寻找任何信息,我发现很少有人提及我的信息

我想样式的网格看起来像一个在链接的屏幕截图

如果实际控件不支持它,我是否可以以某种方式继承它,然后执行它?我是WPF的新手,因此非常感谢您的帮助

还有一件事,我知道我可以对网格中的每个控件进行样式化,但这似乎有些过头了。我想有一个网格,它自己做


WPF
网格
本身没有可见的单元格。可以将它们视为不可见的网格线,子元素可以与之对齐

因此,要设置网格单元格的样式,必须设置网格内对齐的项目的样式

网格
看作类似于WinForms
数据网格
的东西是令人困惑的。我想它最接近WinForms的等价物是
TableLayout
控件


查看一些第三方网格控件。我在试用期使用了DevExpress one,发现它非常简单。

我建议您在样式设计中使用边框

通过为每一行和每一列创建边框并相应地设置行跨度和列跨度,可以非常轻松地重新创建该布局

您将有5个colspan 2边框,这些边框将照顾到每行的渐变背景以及每行顶部和底部的边框。然后,您将有两个行跨度为5的边框,这些边框将处理列边框。假设您正在覆盖边界以形成所追求的视觉栅格效果

对于页眉和外边框,只需根据需要使用边框和样式包装整个网格

我建议您将样式存储为资源,以便将所有样式信息保存在一个位置


注意了解样式是如何工作的,因为它非常强大,但是有一个学习曲线,因为它与CSS的工作方式完全不同。如果可以的话,我建议你阅读。

@Dan推荐我目前正在阅读的WPF unreleased。就在今天早上,我遇到了一个部分,回答了你的问题

第6章,第161页:

常见问题解答:如何像使用HTML表格的单元格一样为网格单元格指定背景色、填充和边框?

没有内在的机制来赋予网格单元这样的属性,但是您可以非常轻松地模拟它们,因为在任何网格单元中都可以出现多个元素。要为单元格指定背景色,只需在矩形中插入适当的填充,默认情况下,该填充会拉伸以填充单元格。要提供单元格填充,可以使用自动调整大小并在相应的子元素上设置边距。对于边框,您可以再次使用矩形,但为其指定适当颜色的显式笔划,或者只需使用边框元素即可

只需确保在任何其他子对象之前将这些矩形或边框添加到网格中(或使用ZIndex attached属性显式标记它们),以便它们的Z顺序将它们放在主内容后面

顺便说一句,WPF释放了岩石。它写得很好,全彩印刷使它更容易阅读。

这里有一个快速的(非常粗糙的样本),你可以尝试获得你想要的格式(如果你真的想使用WPF,你会发现Blend在让你的布局看起来很好方面有巨大的帮助):


我在寻找为DataGrid单元格设置边距(或填充)的方法时发现了这篇文章。我的问题得到了解决,这多亏了在(接近结尾处)发布的示例xaml代码——非常简约


谢谢Dan,但如果这是唯一的方法,我能不能以某种方式继承网格并自动添加边框?我不想把每个控件都添加到边界中。嗨,姆拉登,你不必把每个控件都设置为边界的子控件。您的控件将是网格的子控件。您只需将边框添加为网格的额外子项,以实现网格的“外观”。想象一下,您正在将边框覆盖在其他所有内容之上(或之后)。我尝试模拟的实际组件是DevExpress布局控件(winforms)。我真的很想在单元格中添加背景和边距,但它似乎超出了WPF布局网格。我明白你想要什么。我只是说WPF网格控件不是用于显示表格数据,而是用于布局。也许微软应该称之为GridLayout,以便更清楚。这是2010年版WPF4第5章第128页
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                                                                                                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
       <Page.Resources>
           <Style x:Key="CustomerDefinition" TargetType="TextBlock">
               <Setter Property="Control.FontFamily" Value="Tahoma"/>
               <Setter Property="Control.FontSize" Value="12"/>
               <Setter Property="Control.Foreground" Value="Red"/>
           </Style>
           <Style TargetType="{x:Type Label}">
               <Setter Property="Width" Value="100"/>
           </Style>
           <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
               <Setter Property="SnapsToDevicePixels" Value="True"/>
               <Setter Property="OverridesDefaultStyle" Value="True"/>
               <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
               <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
               <Setter Property="MinWidth" Value="120"/>
               <Setter Property="MinHeight" Value="20"/>
               <Setter Property="AllowDrop" Value="true"/>
               <Setter Property="Width" Value="200"/>
               <Setter Property="Template">
                   <Setter.Value>
                       <ControlTemplate TargetType="{x:Type TextBoxBase}">
                           <Border
                               Name="Border"
                               Background="#FFEBE9E9"
                               BorderBrush="#FF8B8787"
                               BorderThickness="1"
                               CornerRadius="2"
                               Padding="3">
                               <ScrollViewer x:Name="PART_ContentHost" Margin="0"/>
                           </Border>
                           <ControlTemplate.Triggers>
                               <Trigger Property="IsEnabled" Value="False">
                                   <Setter TargetName="Border" Property="Background"
                                                       Value="#EEEEEE"/>
                                   <Setter TargetName="Border" Property="BorderBrush"
                                                       Value="#EEEEEE"/>
                                   <Setter Property="Foreground" Value="#888888"/>
                               </Trigger>
                           </ControlTemplate.Triggers>
                       </ControlTemplate>
                   </Setter.Value>
               </Setter>
           </Style>
           <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
               <GradientBrush.GradientStops>
                   <GradientStopCollection>
                       <GradientStop Offset="0.0" Color="#FFF0EDED"/>
                       <GradientStop Offset="1.0" Color="#FFE1E0E0"/>
                   </GradientStopCollection>
               </GradientBrush.GradientStops>
           </LinearGradientBrush>
       </Page.Resources>
       <Grid>
           <Grid.ColumnDefinitions>
               <ColumnDefinition Width="*"/>
               <ColumnDefinition Width="*"/>
           </Grid.ColumnDefinitions>
           <Grid.RowDefinitions>
               <RowDefinition Height="26"/>
               <RowDefinition Height="23"/>
               <RowDefinition Height="24"/>
               <RowDefinition Height="24"/>
               <RowDefinition Height="24"/>
           </Grid.RowDefinitions>
           <TextBlock
               Grid.ColumnSpan="2"
               Grid.Row="0"
               Style="{StaticResource CustomerDefinition}"
               Text="Customer Definition"/>
           <Border
               Grid.Column="0"
               Grid.Row="1"
               Background="#FFEBE9E9"
               BorderBrush="#FF8B8787"
               BorderThickness="1">
               <StackPanel Background="{StaticResource NormalBrush}" Orientation="Horizontal">
                   <Label Content="Customer Code"/>
                   <TextBox Text="SMITHA 098 (normally I'd bind here)"/>
               </StackPanel>
           </Border>
           <Border
               Grid.Column="1"
               Grid.Row="1"
               Background="#FFEBE9E9"
               BorderBrush="#FF8B8787"
               BorderThickness="1">
               <StackPanel Background="{StaticResource NormalBrush}" Orientation="Horizontal">
                   <Label Content="Customer Type"/>
                   <TextBox Text="PRIVATE INDIVIDUAL"/>
               </StackPanel>
           </Border>
       </Grid> </Page>