【问题标题】:How to style a WPF grid inside a <window>?如何在 <window> 内设置 WPF 网格的样式?
【发布时间】:2012-02-16 04:35:51
【问题描述】:

我有一个 WPF 应用程序,它带有一个在窗口中加载的网格。

如何执行以下操作 (1) 添加页眉渐变样式(2色垂直渐变) (2) 交替行样式到下面的这个网格? (3) 悬停(鼠标悬停在行突出显示)网格中每一行的行样式?

<Window
    x:Class="DiagramDesigner.PadDetailsWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:DiagramDesigner"
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    xmlns:s="clr-namespace:DiagramDesigner"
    xmlns:c="clr-namespace:DiagramDesigner.Controls"
    Title="Pad Details"
    WindowStyle="SingleBorderWindow"
    Width="750"
    Height="650" Loaded="Window_Loaded">

    <Window.Resources>




    </Window.Resources>
<ScrollViewer Name="DesignerScrollViewer" Background="Transparent" HorizontalScrollBarVisibility="Disabled"
  VerticalScrollBarVisibility="Auto">
        <Grid x:Name="LayoutRoot"  Margin="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="650" >
            <StackPanel Orientation="Vertical" Margin="0,0,-27,0">
                <!--<StackPanel>-->
                    <toolkit:DataGrid x:Name="dgMain" ItemsSource="{Binding}" VerticalScrollBarVisibility="Visible" AutoGenerateColumns="False" Width="650" RowHeight="20">
                        <toolkit:DataGrid.Columns>
                            <toolkit:DataGridTextColumn Header="Pad Name" Binding="{Binding Path=PadStream}" Width="80" />
                            <toolkit:DataGridTextColumn Header="Parent" Binding="{Binding Path=Parent}" Width="50"/>
                            <toolkit:DataGridTextColumn Header="Type" Binding="{Binding Path=Type}" Width="50"/>
                            <toolkit:DataGridTextColumn Header="Code" Binding="{Binding Path=Code}" Width="50"/>
                            <toolkit:DataGridTextColumn Header="Volume" Binding="{Binding Path=Volume}" Width="80"/>
                            <toolkit:DataGridTextColumn Header="Mass Rate" Binding="{Binding Path=MassRate}" Width="80"/>
                            <toolkit:DataGridTextColumn Header="Min Flow Rate" Binding="{Binding Path=MinFlowRate}" Width="80"/>
                            <toolkit:DataGridTextColumn Header="Max Flow Rate" Binding="{Binding Path=MaxFlowRate}" Width="*" />
                        </toolkit:DataGrid.Columns>
                    </toolkit:DataGrid>
                <!--</StackPanel>-->
                <StackPanel>
                    <Button x:Name="OKButton" Content="OK" Click="OnOkClick" Width="70" Height="23" HorizontalAlignment="Center"
                        Margin="0,3,0,0" Grid.Row="6" Grid.Column="3"/>
                </StackPanel>
            </StackPanel>

    </Grid>
</ScrollViewer>
</Window>

请让我知道如何为网格完成上述要求的样式。

【问题讨论】:

  • 为什么不使用 WPF 4 中内置的 DataGrid?它已经拥有您想要的所有功能。
  • 感谢您的回复,但我想知道如何使用 XAML 样式设置上面的网格?
  • 除非您使用的是 .net 3.5,否则 DataGrid 是内置于 .net 4.0 中的,因此您无需再引用该工具包。
  • @Baboon 这是相同的DataGrid。 .net 3.5 工具包中的工具包与 .net 4.0 中的工具包相同,只是不再需要工具包引用。

标签: wpf grid styling


【解决方案1】:

来自here的行标题样式:

<Style x:Key="DataGridColumnHeaderStyle" TargetType="{x:Type Custom:DataGridColumnHeader}"  >
<Setter Property="Background" Value="#88800080" />
    <Setter Property="Foreground" Value="White" /> 
    <Style.Triggers>
    <Trigger Property="SortDirection" Value="{x:Null}">
        <Setter Property="Background" Value="{DynamicResource DataGridHeaderBackgroundBrush}" />
        <Setter Property="BorderBrush"  Value="Transparent" />
    </Trigger>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsMouseOver" Value="True" />
            <Condition Property="SortDirection" Value="{x:Null}" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" Value="{StaticResource DataGridHeaderMouseOverBackgroundBrush}" />
        <Setter Property="BorderBrush" Value="{StaticResource DataGridHeaderBorderBrush}" />
    </MultiTrigger>

    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsMouseOver" Value="true" />
            <Condition Property="SortDirection" Value="{x:Null}" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" Value="{StaticResource DataGridHeaderMouseOverBackgroundBrush}" />
        <Setter Property="BorderBrush" Value="{StaticResource DataGridHeaderBorderBrush}" />
    </MultiTrigger>
    <Trigger Property="SortDirection" Value="Ascending">
        <Setter Property="Background" Value="{StaticResource DataGridHeaderSortedBackgroundBrush}" />
    </Trigger>
    <Trigger Property="SortDirection" Value="Descending">
        <Setter Property="Background" Value="{StaticResource DataGridHeaderSortedBackgroundBrush}" />
    </Trigger>
</Style.Triggers>

来自 here 的 mouseover 属性:

    <DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
         <Style.Triggers>
              <Trigger Property="IsMouseOver"
                       Value="True">
                   <Setter Property="Background"
                           Value="Green" />
              </Trigger>
         </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

【讨论】:

  • 我在使用上述样式编译时出现了一些错误。
  • 我曾尝试将自定义更改为工具包,然后它给了我其他错误,例如 ,找不到资源 DataGridHeaderMouseOverBackgroundBrush
  • 在我提供的链接中有一个此代码的工作示例。您收到错误的那一行表示它期望将名为“DataGridHeaderMouseOverBackgroundBrush”的项目定义为资源。您可以创建自己的画笔或查找我链接的工作示例中定义的画笔。仅供参考,工作示例位于帖子的最底部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2018-03-04
  • 2013-11-26
  • 2014-11-11
相关资源
最近更新 更多