[不正解]ここ
で良い解決策を見つけました。次のコードをコピーして貼り付けただけで、それを使用しました。うまくいきました。白い空白をクリックしても、対応する行が選択されます。
<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>
以下のコードのように、リストビューのプロパティ「ItemContainerStyle」を設定します。
<ListView ItemContainerStyle="{DynamicResource columnHeaderContianerStyle}" ... >
[修正された回答]
列コントロールでマウスをキャプチャすることに関心がある場合、上記の解決策は機能しません。backGroundPanel の四角形はマウス イベントをキャプチャするため、マウス イベントが GridViewRowPresenter によってキャプチャされるのを防ぎます。したがって、2 つの機能を持つ戦略を使用する必要があります。
- マウス イベントは、内側の列コントロールでキャプチャする必要があります。
- ユーザーが行のすべての場所をクリックすると、その行が選択されている必要があります。
そのため、今回はソリューションがより簡単になります。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つの機能で正常に動作します。