当前位置:网站首页>WPF 修改 ItemContainerStyle 鼠标移动到未选中项效果和选中项背景
WPF 修改 ItemContainerStyle 鼠标移动到未选中项效果和选中项背景
2022-08-04 16:54:00 【林德熙】
本文告诉大家如何通过修改 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
边栏推荐
猜你喜欢
移动百事通BesTV_R3300-L_S905L_8189_线刷固件包
转型阵痛期,好未来减亏容易增收难?
Minecraft HMCL 使用认证服务器LittleSkin进行登录
"Distributed cloud best practices" BBS, on August 11, shenzhen
Minecraft HMCL 第三方启动器使用教程
RTL8762DK 远端设备配对
How to convert an int attribute into a string in the json format returned by the Go language gin framework?
浙江移动咪咕MGV2000-K4_ZJ_S905l2_7661_线刷固件包
智慧场馆的功能有哪些
MySQL 性能调优和优化技巧
随机推荐
服装店如何利用好积分?
测试开发必备技能-Jmeter二次开发
浙江移动咪咕MGV2000-K4_ZJ_S905l2_7661_线刷固件包
8年软件测试感悟,送给刚入测试行业的小伙伴
机器学习(十):朴素贝叶斯
HCIP笔记(7)
测试零基础如何进入大厂?一场面试教会你(附面试题解析)
越来越火的图数据库到底能做什么?
生产环境重大bug,update加上索引字段会走索引进行更新?还是走全表扫描
容器化 | 在 NFS 备份恢复 RadonDB MySQL 集群数据
Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?
华为应用市场“图章链接”功能上线 让APP分发突破机型壁垒
HCIP笔记(8)
【商家联盟】云平台—异业联盟,打造线上线下商业相结合的系统
《分布式云最佳实践》分论坛,8月11日深圳见
花 30 美金请 AI 画家弄了个 logo,网友:画得非常好,下次别画了!
手把手教你搭建一个Minecraft 服务器
WEB 渗透之XXE&XML
并发编程原理学习-reentrantlock源码分析
人造肉在中国还有未来吗?