【问题标题】:Creating a ControlTemplate for a DataGridRow in WPF在 WPF 中为 DataGridRow 创建 ControlTemplate
【发布时间】:2012-12-25 04:54:12
【问题描述】:

我想要完成的是自定义 DataGrid 控件,使每一行都有圆角,没有网格线(只是我正在使用的设计)。

我一直在尝试做的是创建一个 ControlTemplate 来修改 DataGridRow 控件,以便它们具有预期的外观。到目前为止,这就是我正在使用的:

    <DataGrid Grid.Row="0" Grid.Column="0" Margin="5,5,5,5" AutoGenerateColumns="False" ItemsSource="{Binding Path=MyData}">
        <DataGrid.Resources>
            <Style x:Key="rowStyle" TargetType="{x:Type DataGridRow}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridRow}">
                            <Border CornerRadius="8,8,8,8" BorderBrush="Red" BorderThickness="2">
                                <ContentPresenter />
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Foo"  />
            <DataGridTextColumn Header="Baz" />
            <DataGridTextColumn Header="Bar" />
        </DataGrid.Columns>
   </DataGrid>

这个版本显然是简陋的(只是股票模板周围的边框),但是当我运行应用程序时我看不到任何区别。

那么,问题是如何为 DataGridRow 自定义控件模板?或者,如果这不可行,是否有更好的方法来实现我的目标:?

【问题讨论】:

    标签: c# wpf xaml controltemplate


    【解决方案1】:
    <Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DatagridColumnHeaderStyle">
            <Setter Property="VerticalContentAlignment" Value="Center" />
            <Setter Property="Height" Value="35" />
            <Setter Property="SeparatorBrush" Value="DarkRed" />
            <Setter Property="FontWeight" Value="Black" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                        <Grid>
                            <Border x:Name="columnHeaderBorder"
                                    BorderThickness="1"
                                    Padding="3,0,3,0">
    
                                <ContentPresenter HorizontalAlignment="TemplateBinding HorizontalContentAlignment}"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                            </Border>
                        </Grid>
                    </ControlTemplate>    
                </Setter.Value>
            </Setter>
        </Style>
    

    您可以在 xaml 中输入以下代码

     <DataGrid x:Name="myGridView" 
               Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
               Height="200" Margin="5,15,5,0"  
               AutoGenerateColumns="False" 
               ItemsSource="{Binding Person}" 
               SelectedItem="{Binding Path=PersonDetails, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" >
    
        <DataGrid.Columns>
    
            <DataGridTextColumn HeaderStyle="{StaticResource DatagridColumnHeaderStyle}"  Width="200" Header="Customer Name" Binding="{Binding Path=Name}"/>
            <DataGridTextColumn HeaderStyle="{StaticResource DatagridColumnHeaderStyle}" Width="250" Header="Customer Address" Binding="{Binding Path=Address}"/>
            <DataGridTextColumn HeaderStyle="{StaticResource DatagridColumnHeaderStyle}" Width="100" Header="Order Id" Binding="{Binding Path=OrderId}"/>
    
        </DataGrid.Columns>
    

    【讨论】:

      【解决方案2】:

      该行的实际模板比这要复杂一些。请参阅下面的样式 - 这几乎是基本样式,但我添加了一些您的设计并为 IsMouseOverIsSelected 留下了触发器(随意删除它们)。

      <Style TargetType="{x:Type DataGridRow}">
          <Setter Property="Background"
                  Value="Transparent" />
          <Setter Property="BorderBrush" 
                  Value="Red" />
          <Setter Property="BorderThickness" 
                  Value="2" />
          <Setter Property="SnapsToDevicePixels"
                  Value="true" />
          <Setter Property="Validation.ErrorTemplate"
                  Value="{x:Null}" />
          <Setter Property="ValidationErrorTemplate">
              <Setter.Value>
                  <ControlTemplate>
                      <TextBlock Foreground="Red"
                                 Margin="2,0,0,0"
                                 Text="!"
                                 VerticalAlignment="Center" />
                  </ControlTemplate>
              </Setter.Value>
          </Setter>
          <Setter Property="Template">
              <Setter.Value>
                  <ControlTemplate TargetType="{x:Type DataGridRow}">
                      <Border x:Name="DGR_Border"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}"
                              Background="{TemplateBinding Background}"
                              SnapsToDevicePixels="True"
                              CornerRadius="8,8,8,8">
                          <SelectiveScrollingGrid>
                              <SelectiveScrollingGrid.ColumnDefinitions>
                                  <ColumnDefinition Width="Auto" />
                                  <ColumnDefinition Width="*" />
                              </SelectiveScrollingGrid.ColumnDefinitions>
                              <SelectiveScrollingGrid.RowDefinitions>
                                  <RowDefinition Height="*" />
                                  <RowDefinition Height="Auto" />
                              </SelectiveScrollingGrid.RowDefinitions>
                              <DataGridCellsPresenter Grid.Column="1"
                                                      ItemsPanel="{TemplateBinding ItemsPanel}"
                                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                              <DataGridDetailsPresenter Grid.Column="1"
                                                        Grid.Row="1"
                                                        SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                                        Visibility="{TemplateBinding DetailsVisibility}" />
                              <DataGridRowHeader Grid.RowSpan="2"
                                                 SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
                                                 Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
                          </SelectiveScrollingGrid>
                      </Border>
                      <ControlTemplate.Triggers>
                          <Trigger Property="IsMouseOver"
                                   Value="True">
                              <Setter TargetName="DGR_Border"
                                      Property="Background"
                                      Value="LightGray" />
                          </Trigger>
                          <Trigger Property="IsSelected"
                                   Value="True">
                              <Setter TargetName="DGR_Border"
                                      Property="Background"
                                      Value="Gray" />
                          </Trigger>
                      </ControlTemplate.Triggers>
                  </ControlTemplate>
              </Setter.Value>
          </Setter>
      </Style>
      

      哦,顺便说一句,你有一个样式的键,但你在任何时候都没有引用它 - 所以该行使用它的默认样式。要使用您的样式或上面提供的样式,请不要提供资源的密钥。

      【讨论】:

      • 感谢您的模板。此外,x:Key 属性是最大的问题。我已经习惯了把它们放进去,这是一种反射反应。
      猜你喜欢
      • 2011-02-01
      • 2023-04-02
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多