• 2018-12-1-WPF-修改-ItemContainerStyle-鼠标移动到未选中项效果和选中项背景


    title author date CreateTime categories
    WPF 修改 ItemContainerStyle 鼠标移动到未选中项效果和选中项背景
    lindexi
    2018-12-01 08:18:33 +0800
    2018-12-01 08:12:50 +0800
    WPF

    本文告诉大家如何通过修改 ItemContainerStyle 让 ListView 或 ListBox 的选择效果如鼠标移动到未选中项的效果或选择项的背景

    先写一些简单的代码用于界面的绑定

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
    
                InitializeComponent();
                DataContext = this;
                Items = new List<Item> { new Item(1), new Item(2), new Item(3) };
            }
    
            public List<Item> Items { get; set; }
        }
    
        public class Item
        {
            public Item(int id)
            {
                Id = id;
            }
    
            public int Id { get; set; }
            public string Text { get => $"This is Item number {Id}"; }
        }

    在界面放一个 ListView 默认在鼠标移动到没有被选择的项的时候会出现背景

                <ListView ItemsSource="{Binding Items}">
                    <ListView.ItemTemplate>
                        <DataTemplate DataType="local:Item">
                            <StackPanel>
                                <TextBlock Text="{Binding Id}" />
                                <TextBlock Text="{Binding Text}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

    通过写样式在 ItemContainerStyle 可以让 ListView 的在鼠标移动到未选择项的特效的颜色修改

           <!-- set SelectedBackgroundColor to Transparent when you do not need the background in selected items -->
            <Color x:Key="SelectedBackgroundColor">#00FFFFFF</Color>
            <Color x:Key="SelectedUnfocusedColor">#FFB2A3A2</Color>
    
            <!-- set the MouseOverColor to Transparent when you do not need the effect in the unselected items -->
            <Color x:Key="MouseOverColor" >#00FFFFFF</Color>
    
            <Style x:Key="ListViewItemStyle"
                   TargetType="ListViewItem">
                <Setter Property="SnapsToDevicePixels"
                        Value="true" />
                <Setter Property="OverridesDefaultStyle"
                        Value="true" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Border x:Name="Border"
                                    Padding="2"
                                    SnapsToDevicePixels="true"
                                    Background="Transparent">
                                <VisualStateManager.VisualStateGroups>
                                    <VisualStateGroup x:Name="CommonStates">
                                        <VisualState x:Name="Normal" />
                                        <VisualState x:Name="MouseOver" >
                                            <Storyboard>
                                                <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                                              Storyboard.TargetProperty="(Panel.Background).
                        (SolidColorBrush.Color)">
                                                    <EasingColorKeyFrame KeyTime="0"
                                                                         Value="{StaticResource MouseOverColor}" />
                                                </ColorAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="Disabled" />
                                    </VisualStateGroup>
                                    <VisualStateGroup x:Name="SelectionStates">
                                        <VisualState x:Name="Unselected" />
                                        <VisualState x:Name="Selected">
                                            <Storyboard>
                                                <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                                              Storyboard.TargetProperty="(Panel.Background).
                        (SolidColorBrush.Color)">
                                                    <EasingColorKeyFrame KeyTime="0"
                                                                         Value="{StaticResource SelectedBackgroundColor}" />
                                                </ColorAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="SelectedUnfocused">
                                            <Storyboard>
                                                <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                                              Storyboard.TargetProperty="(Panel.Background).
                        (SolidColorBrush.Color)">
                                                    <EasingColorKeyFrame KeyTime="0"
                                                                         Value="{StaticResource SelectedUnfocusedColor}" />
                                                </ColorAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualState>
                                    </VisualStateGroup>
                                </VisualStateManager.VisualStateGroups>
                                <ContentPresenter />
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

    可以直接使用上面的代码,如果想要让用户看不到鼠标移动到未选中项的特效可以设置 MouseOverColor 为透明,通过设置 SelectedBackgroundColor 可以让选中项的背景修改

    因为颜色在 WPF 使用 #AARRBBGG 表示,如上面代码设置了 #00FFFFFF 就是透明,因为第一个 Alpha 为 0 也就是透明

    在 ListView 使用刚才写的样式,运行代码可以看到下面图片

            <ListView ItemsSource="{Binding Items}"
                      ItemContainerStyle="{StaticResource ListViewItemStyle}">
                <ListView.ItemTemplate>
                    <DataTemplate DataType="local:Item">
                        <StackPanel>
                            <TextBlock Text="{Binding Id}" />
                            <TextBlock Text="{Binding Text}" />
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    

    https://stackoverflow.com/a/53557393/6116637

  • 相关阅读:
    自从学会了搭建开源网站,妈妈再也不担心我找不到web自动化学习环境啦!
    领导要我6点下班前创建1000个有效的手机号,现在5点半了!教你用random模块10分钟搞定!
    python:字符串 扩展分片:第三个限制值
    python字符串:索引和分片
    测试基础:测试用例设计策略
    测试基础:软件测试思维方式
    面试整理:python列表面试习题
    面试整理:linux
    测试的一些思考
    python ConfigParse模块中的方法
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085678.html
Copyright © 2020-2023  润新知