26

我想知道是否有任何方法可以设置 WPF 布局网格的单元格、行和列的样式。我一直在尝试查找任何信息,但我发现的少数提及并没有提供那么多信息。

我想将网格设置为看起来像链接屏幕截图中的网格。

如果实际控件不支持,我可以以某种方式继承它然后做吗?我对 WPF 很陌生,所以非常感谢任何帮助。

另一件事,我知道我可以为网格中的每个控件设置样式,但这似乎有点矫枉过正。我想有一个自己做的网格。

截图 http://img21.imageshack.us/img21/2842/capturehz8.png

4

5 回答 5

26

@Dan 推荐我正在阅读的 WPF Unleashed。就在今天早上,我遇到了一个解决您问题的部分。

第 6 章,第 161 页:

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

没有内在的机制来赋予 Grid 单元这样的属性,但是您可以很容易地模拟它们,这要归功于多个元素可以出现在任何 Grid 单元中的事实。要为单元格提供背景颜色,您可以简单地使用适当的填充插入一个矩形,默认情况下它会拉伸以填充单元格。要给单元格填充,您可以使用自动调整大小并在适当的子元素上设置边距。对于边框,您可以再次使用 Rectangle,但给它一个适当颜色的显式 Stroke,或者您可以简单地使用 Border 元素。

只需确保在任何其他子项之前将此类 Rectangles 或 Borders 添加到 Grid(或使用 ZIndex 附加属性显式标记它们),因此它们的 Z 顺序将它们放在主要内容的后面。

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

于 2009-02-19T13:51:59.533 回答
19

这是一个快速(非常粗略的示例),您可以随意修改以获得您想要的格式(如果您认真使用 WPF,您会发现 Blend 在使您的布局看起来不错方面有很大帮助):

<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>
于 2009-02-19T14:34:09.743 回答
5

WPFGrid没有可见的单元格。将它们视为不可见的网格线,您可以将子元素对齐。

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

Grid将视为 WinForms 之类的东西令人困惑DataGrid。我猜它最接近的 WinForms 等价物是TableLayout控件。

查看一些 3rd 方网格控件。我在测试版中使用了 DevExpress,发现它非常简单。

于 2009-02-19T13:38:08.240 回答
3

我建议您使用边框作为样式。

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

您将有 5 个带有 colspan 2 的边框,这些边框将处理每行的渐变背景以及每行顶部和底部的边框。然后你将有 2 个行跨度为 5 的边框,这些将处理列边框。想象一下,您正在覆盖边框以形成您所追求的视觉网格效果。

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

我建议将您的样式存储为资源,以便您可以将所有样式信息保存在一个地方。

注意了解样式的工作原理,因为它非常强大,但是有一个学习曲线,因为它与 CSS 的工作方式完全不同。如果可以的话,我会推荐阅读WPF Unleashed 。

于 2009-02-19T13:38:34.650 回答
1

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

http://forums.silverlight.net/forums/p/16842/55997.aspx

于 2010-08-06T20:43:46.647 回答