Disable DataGrid current cell border in FullRow selection mode

后端 未结 7 905
走了就别回头了
走了就别回头了 2020-12-24 00:19

I am using a DataGrid in row selection mode (i.e., SelectionUnit=\"FullRow\"). I simply want to remove the border that is being placed around the current cell w

相关标签:
7条回答
  • 2020-12-24 00:54
    <Style x:Key="DataGrid" TargetType="DataGrid">
        <Setter Property="CellStyle">
            <Setter.Value>
                <Style TargetType="DataGridCell">
                    <Setter Property="BorderThickness" Value="0"/>
                    <Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}" />
                    <Setter Property="Background" Value="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" />
                </Style>
            </Setter.Value>
        </Setter>
    </Style>
    
    0 讨论(0)
  • 2020-12-24 00:55

    In case you don't want to mess with XAML styles you could do this simple hack. It does not work as good as XAML styles but you can try it out and see if it fits you. It is fine for simple clicking on cells but if you try to drag cells this won't remove focus afterwards (although I am pretty sure you could add another case which checks for that).

    private void YourDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        YourDataGrid.Focus();
    }
    

    PS: Don't forget to add the event handler to your DataGrid's SelectionChanged property.

    0 讨论(0)
  • 2020-12-24 00:56

    You could set the BorderThickness for DataGridCell to 0

    <DataGrid ...
              SelectionUnit="FullRow">
        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="BorderThickness" Value="0"/>
                <!-- Update from comments.
                     Remove the focus indication for the selected cell -->
                <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            </Style>
        </DataGrid.CellStyle>
        <!-- ... -->
    </DataGrid>
    
    0 讨论(0)
  • 2020-12-24 00:57

    If you want to show a border only when the cell is editable and selected you can override the DataGridCell template and add a multitrigger for when the cell IsSelected and not IsReadOnly. Then no border will be shown for cells if you set IsReadOnly = true for the column or DataGrid

    <ControlTemplate x:Key="MellowDataGridCellTemplate" TargetType="{x:Type DataGridCell}">
        <Grid>
            <ContentPresenter VerticalAlignment="Center" />
            <Rectangle Name="FocusVisual" Stroke="White" StrokeThickness="1" Fill="Transparent" HorizontalAlignment="Stretch" 
                               VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" />
    
        </Grid>
        <ControlTemplate.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsReadOnly" Value="False" />
                    <Condition Property="IsSelected" Value="True" />
                </MultiTrigger.Conditions>
                <Setter TargetName="FocusVisual" Property="Opacity" Value="1"/>
            </MultiTrigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    

    Use the template in a style

    <Style TargetType="{x:Type DataGridCell}" x:Key="MellowGridDataGridCell">
        <Setter Property="Template" Value="{StaticResource MellowDataGridCellTemplate}" />
    </Style>
    

    And use the style

    <DataGrid CellStyle={StaticResource MellowGridDataGridCell >
        ...
    </DataGrid>
    
    0 讨论(0)
  • 2020-12-24 01:10

    If you're using the xceed DataGridControl then set the NavigationBehavior to RowOnly

    <xcdg:DataGridControl NavigationBehavior="RowOnly" SelectionMode="Single"  ....
    
    0 讨论(0)
  • 2020-12-24 01:12

    Saw another answer here that was close, but it didn't get rid of the Focus rectangle. Here's how to obliterate all of the borders.

    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="BorderThickness" Value="0" />
            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        </Style>
    </DataGrid.Resources>
    

    Also, since technically those cells still do get focus (you just don't see it), to make the tab key advance to the next row instead of the next cell, I define a cell style based on the above but which also adds the following...

    <DataGrid.Resources>
        <Style x:Key="NoFocusDataGridCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
            <Setter Property="Focusable"        Value="False" />
            <Setter Property="IsTabStop"        Value="False" />
            <Setter Property="IsHitTestVisible" Value="False" />
        </Style>
    </DataGrid.Resources>
    

    ...then I apply that to all but the first column definition. That way the tab key advances to the next row, not the next cell.

    Back to the borders however. If you want to hide them but still want them to be part of the layout for spacing-reasons, change the above to this...

    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="BorderBrush" Value="Transparent" />
            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        </Style>
    </DataGrid.Resources>
    

    Enjoy! :)

    0 讨论(0)
提交回复
热议问题