[不是一个好的答案]
我在这里找到了一个好的解决方案。我只是复制并粘贴了以下代码并使用了它。它的工作。即使您单击白色空白,也会选择相应的行。
<ControlTemplate TargetType="ListViewItem" x:Key="rowStyle1">
<Grid x:Name="backGroundPanel">
<GridViewRowPresenter Content="{TemplateBinding Content}" />
<Rectangle Fill="White" Opacity="0"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="backGroundPanel" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="columnHeaderContianerStyle" TargetType="ListViewItem">
<Setter Property="Template" Value="{StaticResource ResourceKey=rowStyle1}"/>
</Style>
我设置了listview的属性“ItemContainerStyle”,如下面的代码:
<ListView ItemContainerStyle="{DynamicResource columnHeaderContianerStyle}" ... >
[修改后的答案]
如果我们有兴趣在列控件中捕获鼠标,则上述解决方案不起作用。因为 backGroundPanel 中的矩形捕获了鼠标事件,所以它可以防止鼠标事件被 GridViewRowPresenter 捕获。所以我们必须使用具有两个特征的策略:
- 鼠标事件应由内栏控件捕获。
- 当用户单击行中的每个位置时,必须选择该行。
所以,这次解决方案变得更简单了。我为我的 ListView 的 ItemContainerStyle 使用了下面的代码。
<Style x:Key="columnHeaderContianerStyle" TargetType="ListViewItem">
<EventSetter Event="PreviewMouseDown" Handler="ListViewItem_PreviewMouseDown"></EventSetter>
</Style>
和事件处理程序是:
private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (sender is ListViewItem)
{
ListViewItem s = (ListViewItem)sender;
s.IsSelected = true;
}
}
它适用于 2 个提到的功能。