wpf ListView DataTemplate方式的鼠标悬停和选中更改背景色

今天使用wpf技术弄一个ListView的时候,由于需求需要,需要ListView显示不同的数据模板,很自然的使用了DataTemplate方式来定义多个数据模板,并在ListView中使用ItemTemplateSelector绑定模板。添加上数据源显示后数据显示根据数据的类型不同显示了不同的数据模板,这很符合我的需求,但是当我把鼠标悬停到ListView和选中一行数据时,惊讶的发现ListView还是显示自带的背景色,简直丑哭了,不能忍,我要自定义鼠标悬停和选中的背景色。

通过一上午的忙碌才发现,原来ListView里是由多个ListViewItem包含DataTemplate方式来显示数据的,因此我们需要先设置ListViewItem的BorderThickness和Padding大小为0,再接着DataTemplate设置为背景色。实现代码如下:

 1 <DataTemplate x:Key="MessageDataTemplateLeft">
 2
 3         <Grid x:Name="messageGrid" >
 4             <Grid.Resources>
 5                 <Common:ConcatImageExtensionConverter x:Key="ConcatImageExtensionConverter"/>
 6             </Grid.Resources>
 7             <Grid.RowDefinitions>
 8                 <RowDefinition Height="auto"/>
 9             </Grid.RowDefinitions>
10             <Grid.ColumnDefinitions>
11                 <ColumnDefinition Width="auto"/>
12                 <ColumnDefinition Width="*"/>
13             </Grid.ColumnDefinitions>
14             <Grid Grid.Row="0" Grid.Column="0">
15                 <Ellipse Width="45" Height="45">
16                     <Ellipse.Fill>
17                         <ImageBrush ImageSource="{Binding Path=FromMailAccount,Converter={StaticResource ConcatImageExtensionConverter}}"></ImageBrush>
18                     </Ellipse.Fill>
19                 </Ellipse>
20             </Grid>
21             <Grid Grid.Row="0" Grid.Column="1">
22                 <Border Margin="10,0,40,0" Background="#00CD00" CornerRadius="10" HorizontalAlignment="Left">
23                     <TextBlock TextWrapping="Wrap" Text="{Binding Path=MessageContent}" Padding="10"/>
24                 </Border>
25                 <Viewbox HorizontalAlignment="Left" Margin="2,5" Height="19" VerticalAlignment="Top" Width="13.5">
26                     <Path Data="M32.4762,3.74901 C28.1542,4.60015 20.7241,2.92959 13.75,0.75 C15.5005,7.13589 28.4124,17.9116 29.5357,17.4874" Fill="#00CD00"  Stretch="Fill" Stroke="#00CD00" UseLayoutRounding="False" />
27                 </Viewbox>
28             </Grid>
29         </Grid>
30         <DataTemplate.Triggers>
31             <DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
32                 <Setter TargetName="messageGrid" Property="Background" >
33                     <Setter.Value>
34                         <SolidColorBrush Color="White" />
35                     </Setter.Value>
36                 </Setter>
37             </DataTrigger>
38             <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
39                 <Setter TargetName="messageGrid" Property="Background" >
40                     <Setter.Value>
41                         <SolidColorBrush Color="White" />
42                     </Setter.Value>
43                 </Setter>
44             </DataTrigger>
45         </DataTemplate.Triggers>
46     </DataTemplate>
47     <DataTemplate x:Key="MessageDataTemplateRight">
48         <Grid x:Name="messageGrid">
49             <Grid.Resources>
50                 <Common:ConcatImageExtensionConverter x:Key="ConcatImageExtensionConverter"/>
51             </Grid.Resources>
52             <Grid.RowDefinitions>
53                 <RowDefinition Height="auto"/>
54             </Grid.RowDefinitions>
55             <Grid.ColumnDefinitions>
56                 <ColumnDefinition Width="*"/>
57                 <ColumnDefinition Width="auto"/>
58             </Grid.ColumnDefinitions>
59             <Grid Grid.Row="0" Grid.Column="0">
60                 <Border Margin="40,0,10,0" Background="#00CD00" CornerRadius="10" HorizontalAlignment="Right">
61                     <TextBlock TextWrapping="Wrap" Text="{Binding Path=MessageContent}" Padding="10"/>
62                 </Border>
63                 <Viewbox HorizontalAlignment="Right" Margin="2,5" Height="19" VerticalAlignment="Top" Width="13.5" RenderTransformOrigin="0.5,0.5">
64                     <Viewbox.RenderTransform>
65                         <ScaleTransform ScaleX="-1"/>
66                     </Viewbox.RenderTransform>
67                     <Path Data="M32.4762,3.74901 C28.1542,4.60015 20.7241,2.92959 13.75,0.75 C15.5005,7.13589 28.4124,17.9116 29.5357,17.4874" Fill="#00CD00"  Stretch="Fill" Stroke="#00CD00" UseLayoutRounding="False" />
68                 </Viewbox>
69             </Grid>
70             <Grid Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right">
71                 <Ellipse Width="45" Height="45">
72                     <Ellipse.Fill>
73                         <ImageBrush ImageSource="{Binding Path=FromMailAccount,Converter={StaticResource ConcatImageExtensionConverter}}"></ImageBrush>
74                     </Ellipse.Fill>
75                 </Ellipse>
76             </Grid>
77         </Grid>
78         <DataTemplate.Triggers>
79             <DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
80                 <Setter TargetName="messageGrid" Property="Background" >
81                     <Setter.Value>
82                         <SolidColorBrush Color="White" />
83                     </Setter.Value>
84                 </Setter>
85             </DataTrigger>
86             <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
87                 <Setter TargetName="messageGrid" Property="Background" >
88                     <Setter.Value>
89                         <SolidColorBrush Color="White" />
90                     </Setter.Value>
91                 </Setter>
92             </DataTrigger>
93         </DataTemplate.Triggers>
94     </DataTemplate>

资源数据模板文件

 1 public class MessageItemDataTemplateSelector : DataTemplateSelector
 2     {
 3         public override DataTemplate SelectTemplate(object item, DependencyObject container)
 4         {
 5             var tempItem = item as ChatMessage;
 6
 7             if (tempItem.MessageType == MessageType.Incoming)
 8             {
 9                 return App.Current.Resources["MessageDataTemplateLeft"] as DataTemplate;
10             }
11             else
12             {
13                 return App.Current.Resources["MessageDataTemplateRight"] as DataTemplate;
14             }
15         }
16     }

模板选择器代码

<Page.Resources>
        <Common:MessageItemDataTemplateSelector x:Key="MessageItemDataTemplateSelector"/>
    </Page.Resources>
    <Grid>
        <ListView x:Name="chatListView" ItemTemplateSelector="{StaticResource MessageItemDataTemplateSelector}"
                  Background="Transparent">
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                    <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="Padding" Value="0"/>
                    <Setter Property="BorderThickness" Value="0"/>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </Grid>

前台代码

由上面设置即可设置鼠标悬停和选择样式,我先设置为白色背景了。根据自己需求设置背景色。

同时注意:在使用数据模板样式选择器时,不能设置ItemContainerStyle的属性值,如果设置了该值,那么数据模板样式选择器会失去作用。

即在ItemContainerStyle里不能再次设置Template不然会被覆盖掉DataTemplate,导致数据没有显示。

时间: 2024-10-24 19:28:30

wpf ListView DataTemplate方式的鼠标悬停和选中更改背景色的相关文章

两种方式实现鼠标悬停图片逐渐变大

鼠标悬停图片逐渐变大这是一个很常见的效果,这里推荐两种方式,各有优缺点: 1.利用js,通过定时器实现宽高的加减. //鼠标移动图片变大 function change_large(obj,speed,target_width,target_height){ var timer = null; var bengin_width = 140;//初始宽度 var bengin_height = 180;//初始高度 clearInterval(timer); timer = setInterval

Bootstrap3基础 table-bordered/hover 表格加外边框和鼠标悬停对应行的背景色加深

礼悟:    公恒学思合行悟,尊师重道存感恩.叶见寻根三返一,江河湖海同一体.          虚怀若谷良心主,愿行无悔给最苦.读书锻炼养身心,诚劝且行且珍惜.              ide:visual studio 2017             browser:Firefox / Chrome   bootstrap:3.3.7 代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta

用WPF实现在ListView中的鼠标悬停Tooltip显示

原文:用WPF实现在ListView中的鼠标悬停Tooltip显示 一.具体需求描述 在WPF下实现,当鼠标悬停在ListView中的某一元素的时候能弹出一个ToolTip以显示需要的信息. 二.代码实现 在.XMAL文件中 Code<Window.Resources> <DataTemplate x:Key="dataTemplateCheckBox"> <StackPanel Orientation="Horizontal">

不用js代码,在selenium里面实现鼠标悬停

一种简单的方式实现鼠标悬停,用selenium自带的Actions类中的 move_to_element() 方法很难实现,因为这个方法使得鼠标悬停一闪而过,不能达到悬停的效果.还是以百度首页右上角的按个"设置"为例,找到该按钮下的"搜索设置",从而进行点击,代码如下: from selenium import webdriverdriver = webdriver.Firefox()driver.get('https://www.baidu.com/index.p

WP/UWP设置ListView、ListBox选中、鼠标悬停背景/样式

最近抽空一直在边学边写UWP,后台还好,碰见UI的问题经常脑袋大.这是一个简单但是很不容易做到的事情,特别是对于我这种比较懒的.网上查资料少之又少,大部分都是andriod,所以查一个东西往往会花很多时间. 因为经常碰到ListView或者ListBox之类的选中.鼠标悬停样式和自己设置的主题颜色不搭,这时就需要改变这些样式了,而这里我通过ListBox来说明,大致思路其实就是重新定义ListBoxItem的Template. 第一步:去掉所有的样式,也是就是所有样式都不要. <Style x:

WPF之DataTemplate的使用

一 概要 通过实例演示DataTemplate的基本用法,并通过实例来说明DataTemplate相关知识点. 二 实例操作 1 新建WPF应用程序WpfTemplateExp,程序结构如下图所示. 图1 程序结构图 程序最终的运行效果如下图所示. 图2 程序运行效果图 程序完成的功能是: 通过列表显示学生信息,并在选中某学生时,在列表下方的文本框中显示该生的总评信息. 2 新建实体类Student(类文件名为Student.cs),详细代码如下所示. //*******************

鼠标悬停相关操作

css相关操作: 常用场景: 1. 给盒子加阴影 .operater-item:hover { box-shadow: 0 3px 7px 0 rgba(174, 174, 174, 0.5); } 2. 悬停显示文字 <div title="悬停显示的说明文字">悬停显示文字</div> 3. 悬停显示隐藏的子元素盒子 即hover同样可以对子元素进行样式操作 <div class="operater-item"> <di

bootstra表格鼠标悬停与状态类

今天在学习的过程中遇到在表格一章中 鼠标悬停 与 状态类 无效的问题,是因为在css文件中默认颜色都为白色造成的,解决方式如下: 在bootstrap文件夹中找到bootstrap.css文件(我的版本是3.3.7),2323行修改鼠标悬停背景颜色,2337行修改 状态类 背景颜色. 下图位修改完成后的效果: 改完之后请千万不要忘记把原先使用的 bootstrap.min.css 换成 bootstrap.css!

使用鼠标监听器,使鼠标悬停在JTable某行时背景色改变

一.需要知道的事实: 1.当鼠标悬停在JTable上时,相应的格子(cell)的渲染器(TableCellRenderer)的渲染方法(getTableCellRenererComponent)会被调用,但不够及时(这一点可以通过在渲染方法里打印一句话来自行测试), 而且只是鼠标覆盖的格子的渲染方法会被调用,与其同一行的其他格子的渲染方法并未被调用.所以,指望只通过修改渲染器就能达到目的是不可能的了. 2.JTable的所有监听器都在TableUI(默认使用的是BasicTableUI)中定义,