Karakuri.com

Fintechではたらくアプリケーションエンジニアの技術録

WPFのXAMLのListViewのマウスオーバーや行選択時のハイライトを無効にする

WPFのListViewを使ってリッチなカスタムリストを作成したとき、クリックしたときに背景色が変わるのを解除したくなります。せっかく綺麗なデザインにしたのにクリックした瞬間に選択色がついて台無しに。しかし残念ながらListViewのプロパティ1つをFalseにすれば済むような話ではありませんでした。

ListViewを選択したときのハイライト

f:id:hazakurakeita:20170919000048p:plain
こんなListViewがあったとします。ここで例えば「0005」をクリックしてみます。
f:id:hazakurakeita:20170919000133p:plain
するとハイライトされてしまいます。また、マウスが上にあるときのハイライト(0002)も邪魔ですよね。
f:id:hazakurakeita:20170919000538p:plain
この2つのハイライトを禁止にします。

ItemContainerStyleを定義する

まずはResourcesにItemContainerStyleを定義します。今回はApp.xamlに定義します。Window.ResourcesやPage.Resourcesでも良いですが、App.xamlのApplication.Resourcesが一番良いのではないでしょうか。

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style x:Key="ContainerStyle" TargetType="ListViewItem" >
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ContentControl}">
                        <Border Background="{TemplateBinding Background}">
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="Transparent" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Application.Resources>
</Application>

そしてこれをListViewのItemContainerStyleで指定します。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="500" Width="525">
    <Grid>
        <ListView ItemContainerStyle="{StaticResource ContainerStyle}"/>
    </Grid>
</Window>

これでハイライトは消えます。