当给单元格添加填充时,DataGrid行选择无法工作

4
在WPF中,DataGrid控件的行为有些奇怪。当我单击一行时,它应该被选中。但是当我单击单元格边框或行边框时,会出现问题。它根本不做任何操作。作为用户,我希望单击行并选择它,而不是让我重新单击,因为我意外地单击了单元格之间的边框。
是否可能以某种方式修复这种行为,使得无论我在哪里单击都会选择行?
[编辑]
我发现这是我应用于DataGrid的CellStyle属性的样式问题。
<Style x:Key="CustomDataGridCellStyle" TargetType="DataGridCell">
    <Setter Property="Padding" Value="2" />
    <Setter Property="Margin" Value="0" />
    <Setter Property="Background" Value="White" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridCell">
                <Border x:Name="border" 
                              BorderBrush="#CCaaccda"
                              BorderThickness="1"
                              CornerRadius="0"
                              Padding="4"
                            >
                    <ContentPresenter />
                </Border>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="true">
                        <Setter TargetName="border" Property="Background" Value="#CC119EDA"/>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>

如果我将它移除,它就可以正常工作。我想知道样式如何影响交互控制。
[编辑]
Padding="4"

防止单元格之间创建空白区域无法进行点击测试。有没有办法在单元格中添加不会阻挡点击测试的填充?


[编辑]

而解决方案非常奇怪。

<Grid Background="Transparent" IsHitTestVisible="True">
    <ContentPresenter Margin="4"/>
</Grid>

单元格内容添加了边距,但不响应点击。但我将其包围在具有IsHitTestVisible="True"和透明的网格中。WPF真是太奇怪了。


1
请添加XAML和代码后台。 - israel altar
当单击WPF DataGrid行时,默认情况下应选择该行。也许代码有问题。您需要提供您的代码。 :) - Ignatius
似乎Padding="4"为单元格内容添加了无法命中测试的空间。我还将IsHitTestVisible="True"添加到边框中,现在它正常工作了。我想用hittest添加这个填充。也许有人对此有解决方案。 - gemGreg
2
我相信我的答案可以解决你的问题。你在行边框和实际单元格内容之间留下了4个像素,导致它们无法被点击,也就是说它们无法捕捉到点击测试。 - eran otzap
我可以将其设置为0,但我希望单元格内容有一些空间来包围它,并且还可以点击。添加<Setter Property="Background" Value="Transparent"/>没有帮助。 - gemGreg
1个回答

4
自从你没有发布任何xaml或者你的datagrid的图片,很难确定问题所在。然而,这可能是由于命中测试失败造成的。鼠标命中测试通过代表它的彩色像素矩阵检测元素。尝试将所有像素着色为透明,透明不会影响行的外观,并且会为命中测试着色:
<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Background" Value="Transparent" />
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

1
你的解决方案给了我灵感。我添加了一个网格,用IsHitTestVisible = "True"包围每个单元格,并使背景透明。 - gemGreg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接