shuhelohelo’s blog

Xamarin.Forms多めです.

CollectionViewならVisual State Managerで選択時の背景色を変えられる

docs.microsoft.com

CollectionViewであればDataTemplate直下のコンテナ要素の背景色をVisual State Managerで切り替えることで,アイテム選択時の背景色を変更できる.

これは素晴らしい!プラットフォームごとに実装する必要がない.とても簡単.

StyleのターゲットはあくまでもGridやStackLayoutといったDataTemplate直下のコントロールである必要がある.

以下の例はGridに対してVisual State Managerを使って選択時と非選択時のStyleを定義したときの,ListViewとCollectionViewでの挙動の比較です.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    x:Class="XFListViewBGColor.MainPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="Grid">
                <Setter Property="VisualStateManager.VisualStateGroups">
                    <VisualStateGroupList>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="Selected">
                                <VisualState.Setters>
                                    <Setter Property="BackgroundColor" Value="LightSkyBlue" />
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateGroupList>
                </Setter>
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout>
        <Label Text="Hello" />
        <ListView ItemsSource="{Binding Items}">
            <d:ListView.ItemsSource>
                <x:Array Type="{x:Type x:String}">
                    <x:String>Item 1</x:String>
                    <x:String>Item 2</x:String>
                    <x:String>Item 3</x:String>
                    <x:String>Item 4</x:String>
                    <x:String>Item 5</x:String>
                    <x:String>Item 6</x:String>
                    <x:String>Item 7</x:String>
                </x:Array>
            </d:ListView.ItemsSource>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid>
                            <Label Text="{Binding .}" />
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <CollectionView ItemsSource="{Binding Items}" SelectionMode="Single">
            <d:CollectionView.ItemsSource>
                <x:Array Type="{x:Type x:String}">
                    <x:String>Item 1</x:String>
                    <x:String>Item 2</x:String>
                    <x:String>Item 3</x:String>
                    <x:String>Item 4</x:String>
                    <x:String>Item 5</x:String>
                    <x:String>Item 6</x:String>
                    <x:String>Item 7</x:String>
                </x:Array>
            </d:CollectionView.ItemsSource>
            <CollectionView.ItemsLayout>
                <LinearItemsLayout Orientation="Vertical" />
            </CollectionView.ItemsLayout>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid HeightRequest="75">
                        <Label Text="{Binding .}" />
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </StackLayout>

</ContentPage>

ListViewではアイテム選択時の背景色はオレンジのままだが,CollectionViewの方は指定した色になっていることがわかる.

f:id:shuhelohelo:20200303120606p:plain