今天使用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. 限制input只能输入金额(类似:100.00|100.9|100)

    $(".inputmoney").keyup(function () {    var reg = $(this).val().match(/\d+\.?\d{0,2}/);    ...

  2. webrtc中APM(AudioProcessing module)的使用

    一,实例化和配置 AudioProcessing* apm = AudioProcessing::Create(0); //这里的0指的是channelID,只是一个标注那个通道的表示 apm-> ...

  3. ue4 c++学习推荐

    我由易到难推荐,不过在此之前还是先看看官方对于VS设置的推荐: https://docs.unrealengine.com/latest/INT/Programming/Development/Vis ...

  4. Powershell脚本执行权限

    Powershell脚本需要使用PS1扩展名 在加载脚本前需要确认是都有执行权限,默认是Restricted(受限的), 可以执行Get-ExecutionPolicy查看权限, 一般情况下使用 Re ...

  5. Android 学习笔记之一 “Unable to establish loopback connection”

    今天碰到一个错误:Unable to establish loopback connection,在网上找各种方法都解决不了,后来看一个帖子说是要关闭系统防火墙,尝试了下还是不行.最后是进任务管理器杀 ...

  6. 案例1.通过Jquery来处理复选框

    实现以下功能: 1:选中第一个复选框,那么下面所有的复选框都选中,去除选中第一个复选框,下面的都不选中 2:当点击全选按钮,上面足球.篮球.游泳.唱歌 全部选中 3:当点击全不选按钮,上面四个全部取消 ...

  7. 原生js模拟锚点,实现点击后,内容定位到本页的对应位置

    今天在做angularJS项目过程中,遇见了一个需求,在一个页面中有多个表格,每个表格都有对应的分页,点击顶部对应的模块,可以定位到每个表格模块具体的位置. 页面如下所示: 在angular中,为了使 ...

  8. HashMap实现缓存

    package com.cache; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.a ...

  9. 【Beta】Daily Scrum Meeting总结

    团队博客目录:FTD团队博客目录 一.项目预期计划和现实进展 更换网络请求框架为okHttp 完成 补充和完善服务器的API 完成(可与web端互连) 补充和完善app与服务器交互的类和方法 完成 完 ...

  10. Android使用Application的好处

    如果一个应用程序有2个入口的,1个入口程序打开修改其中的内容,怎么实现另一个入口的数据也修改呢? 下面就用到Application来实现数据的共享,因为一个应用程序只有一个Application,Ap ...