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

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

 <DataTemplate x:Key="MessageDataTemplateLeft">

         <Grid x:Name="messageGrid" >
<Grid.Resources>
<Common:ConcatImageExtensionConverter x:Key="ConcatImageExtensionConverter"/>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Row="" Grid.Column="">
<Ellipse Width="" Height="">
<Ellipse.Fill>
<ImageBrush ImageSource="{Binding Path=FromMailAccount,Converter={StaticResource ConcatImageExtensionConverter}}"></ImageBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
<Grid Grid.Row="" Grid.Column="">
<Border Margin="10,0,40,0" Background="#00CD00" CornerRadius="" HorizontalAlignment="Left">
<TextBlock TextWrapping="Wrap" Text="{Binding Path=MessageContent}" Padding=""/>
</Border>
<Viewbox HorizontalAlignment="Left" Margin="2,5" Height="" VerticalAlignment="Top" Width="13.5">
<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" />
</Viewbox>
</Grid>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
<Setter TargetName="messageGrid" Property="Background" >
<Setter.Value>
<SolidColorBrush Color="White" />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
<Setter TargetName="messageGrid" Property="Background" >
<Setter.Value>
<SolidColorBrush Color="White" />
</Setter.Value>
</Setter>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<DataTemplate x:Key="MessageDataTemplateRight">
<Grid x:Name="messageGrid">
<Grid.Resources>
<Common:ConcatImageExtensionConverter x:Key="ConcatImageExtensionConverter"/>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid Grid.Row="" Grid.Column="">
<Border Margin="40,0,10,0" Background="#00CD00" CornerRadius="" HorizontalAlignment="Right">
<TextBlock TextWrapping="Wrap" Text="{Binding Path=MessageContent}" Padding=""/>
</Border>
<Viewbox HorizontalAlignment="Right" Margin="2,5" Height="" VerticalAlignment="Top" Width="13.5" RenderTransformOrigin="0.5,0.5">
<Viewbox.RenderTransform>
<ScaleTransform ScaleX="-1"/>
</Viewbox.RenderTransform>
<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" />
</Viewbox>
</Grid>
<Grid Grid.Row="" Grid.Column="" HorizontalAlignment="Right">
<Ellipse Width="" Height="">
<Ellipse.Fill>
<ImageBrush ImageSource="{Binding Path=FromMailAccount,Converter={StaticResource ConcatImageExtensionConverter}}"></ImageBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
<Setter TargetName="messageGrid" Property="Background" >
<Setter.Value>
<SolidColorBrush Color="White" />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" Value="True">
<Setter TargetName="messageGrid" Property="Background" >
<Setter.Value>
<SolidColorBrush Color="White" />
</Setter.Value>
</Setter>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>

资源数据模板文件

 public class MessageItemDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var tempItem = item as ChatMessage; if (tempItem.MessageType == MessageType.Incoming)
{
return App.Current.Resources["MessageDataTemplateLeft"] as DataTemplate;
}
else
{
return App.Current.Resources["MessageDataTemplateRight"] as DataTemplate;
}
}
}

模板选择器代码

<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=""/>
<Setter Property="BorderThickness" Value=""/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>

前台代码

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

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

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

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

  1. 在WPF按钮删除默认的鼠标悬停效果

    如果你想在应用程序的所有按钮将此风格,那么这种风格可以插入Application.Resources部分的App.xaml页面. <Window.Resources> <Style ...

  2. WPF按钮删除默认的鼠标悬停效果

    <Style x:Key="NormalMouseButton" TargetType="Button"> <Setter Property= ...

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

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

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

    原文:用WPF实现在ListView中的鼠标悬停Tooltip显示 一.具体需求描述 在WPF下实现,当鼠标悬停在ListView中的某一元素的时候能弹出一个ToolTip以显示需要的信息. 二.代码 ...

  5. WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画

    原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同 ...

  6. WPF 获取 ListView DataTemplate 中控件值

    原文:WPF 获取 ListView DataTemplate 中控件值 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei19 ...

  7. WPF文字排列方式解析zz

      WPF文字的处理是一个比较基础的技能.在使用WPF开发工具时,对于各种文字的处理时经常会遇到的情况.希望大家可以通过实践经验的积累,牢固掌握这一方面知识. AD:WOT2014:用户标签系统与用户 ...

  8. WPF ListView 选中问题

    WPF ListView 选中问题  摘自:http://www.cnblogs.com/BBHor/archive/2013/04/28/VisualTreeHelper-PreviewMouseD ...

  9. [WPF]ListView点击列头排序功能实现

    [转]   [WPF]ListView点击列头排序功能实现 这是一个非常常见的功能,要求也很简单,在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了. ...

随机推荐

  1. 寒冬之下,浩瀚智能开单收银打印扫描POS为何能在批发零售门店商场 车销行业 风靡!:进销存+打印扫描POS机

    是一款适用于商超.餐饮.服装鞋帽.家电专营等等具有零售行业特点的企业,供企业管理人员用于管理.监控本品牌的市场占有率.门店覆盖区域.网点分布合理性等经济地理信息的工具平台. 1,功能一:业务抄单文章来 ...

  2. .NET string字符串的截取、移除、替换、插入

    在实际开发中经常要用到string的各种截取等操作,在这里总结自己认为经常出现的.NET 字符串的截取.移除.替换.插入操作,方面以后查阅. 前台代码: <%@ Page Language=&q ...

  3. OSG 3D场景渲染编程概述

    OSG是Open Scene Graphic的缩写,是基于C++平台的使用OpenGL技术的开源3D场景开发. vs环境安装或者是在Ubuntu中环境的安装网上教程很多,都是大同小异的,认真操作容易成 ...

  4. (转) 注意啦,笔记本是无线的,虚拟机上网方式莫用NAT,好难整。

    有线网络 在有线网络的条件下,vmware的安装非常简单,上网方式几乎不用怎么设置(默认 NAT模式) 如果默认情况下不能上网,则按以下步骤尝试: ************************** ...

  5. 面试中常问的有关随机选取k个数的总结

    1.在半径为1的圆中随机选取一点. 2.给定一个未知长度的整数流,如何随机选取一个数 3.给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字).如何才能从这个无穷尽的流 ...

  6. ACM: Gym 101047B Renzo and the palindromic decoration - 手速题

     Gym 101047B  Renzo and the palindromic decoration Time Limit:2000MS     Memory Limit:65536KB     64 ...

  7. 关于UIScrollerView的基本用法和代理

    - (void)viewDidLoad { [super viewDidLoad];  scrollView = [[UIScrollView alloc] initWithFrame:CGRectM ...

  8. node-webkit安装及简单实现

    遇到一个客户说不要登录网页访问系统,说是不安全,要做成像是QQ这样的客户端. 这让我很为难啊,项目都快做好了,不可能让我重新做吧,再说C++什么的我也不会啊, 于是我接触了node-webkit,并觉 ...

  9. Convert PLY to VTK Using PCL 1.6.0 使用PCL库将PLY格式转为VTK格式

    PLY格式是比较流行的保存点云Point Cloud的格式,可以用MeshLab等软件打开,而VTK是医学图像处理中比较常用的格式,可以使用VTK库和ITK库进行更加复杂的运算处理.我们可以使用Par ...

  10. java的jxl技术导入Excel

    项目结构: http://www.cnblogs.com/hongten/gallery/image/112177.html 在项目中我们看到Reference Libraries中的jxl.jar包 ...