wpflistviewdatatemplate方式的鼠标悬停和选中更改背景色

醉梦ai天涯 醉梦ai天涯     2022-08-13     459

关键词:

         今天使用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,导致数据没有显示。

单片机外部中断有两种信号方式,即电平方式和脉冲方式.啥叫电平方式啥叫脉冲方式

...51单片机,外部中断包括电平触发和边沿触发。电平触发方式是指当检测到引脚是低电平时,进入中断。边沿触发是指检测到引脚由高电平变为低电平时,进入中断参考技术A电平,就是读取平均电压,脉冲,就是读取瞬间上升沿... 查看详情

桌面快捷方式如何创建如何创建桌面快捷方式

参考技术A通过添加软件位置创建桌面快捷方式。1、在桌面右击点击“新建”,点击“创建快捷方式”。2、点击“浏览”,任意选择软件的图标,浏览需要创建的快捷方式。3、输入快捷方式的名称,点击完成,就成功创建了软... 查看详情

Qt override widget 快捷方式(窗口快捷方式)

】Qtoverridewidget快捷方式(窗口快捷方式)【英文标题】:Qtoverridewidgetshortcut(windowshortcut)【发布时间】:2017-07-0422:50:30【问题描述】:我有一个Qt应用程序,在QtDesigner表单操作中定义了多个窗口快捷方式。在焦点位于处理相同组... 查看详情

spring@enable模块装配的注解及编程实现方式,及包括“注解方式”,“编程方式”的自定义模块装配方式(代码片段)

前言通过模式注解的方式加载单一Bean,那如果有相关联的一系列Bean需要加载,是不是意味着每个被关联的类都需要单独加载呢?并不是哦!对于相关联的多个类。我们可以使用Enable方式同时加载多个类。同时Enabl... 查看详情

4.hibernate检索方式

Hibernate检索方式的分类Hibernate的检索方式主要有5种,分别为导航对象图检索方式、OID检索方式、HQL检索方式、QBC检索方式和SQL检索方式。下面对这5中检索方式的使用进行详解。 1.对象图导航检索对象图导航检索方式是根据... 查看详情

如何在快捷方式窗口中显示快捷方式?

】如何在快捷方式窗口中显示快捷方式?【英文标题】:HowtoshowshortcutsinShortcutsWindow?【发布时间】:2021-02-0916:39:11【问题描述】:我需要一个ShortcutsWindow的简单工作示例(使用Gtkmm3),其中只有一个不使用Gtk::Builder的ShortcutsShortc... 查看详情

基于c#实现文本读取的7种方式

基于C#实现文本读取的7种方式博主介绍前言第一个方式第二个方式第三个方式第四个方式第五个方式第六个方式第七个方式 查看详情

算法漫游指北(第十四篇):二叉树的深度优先遍历前序遍历(递归方式/非递归方式)中序遍历(递归方式/非递归方式)后序遍历(递归方式/非递归方式)

...搜索树的分支。那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder_traversal),中序遍历(inorder_traversal)和后序遍历(post... 查看详情

k/3中间层注册三种安全认证方式:交互式用户方式,网络服务方式,信任方式有啥区别

...考技术A尊敬的客户,您好:k/3中间层注册三种安全认证方式:交互式用户方式,网络服务方式,信任方式,是指组件服务中生成的COM+应用程序中的组件包的运行账户(注册中间层后产生很多ebo开头的和kdsvrmgr组件包)。三种方... 查看详情

springboot打包的两种方式-jar方式和war方式(代码片段)

SpringBoot打包的两种方式-jar方式和war方式首先:配置maven环境变量新建系统变量MAVEN_HOMEE:\\JDK\\mave\\apache-maven-3.8.4在Path写入%MAVEN_HOME%\\binjar方式执行mvninstall命令开始打包生成的文件在target运行打包好的jar包:地址为绝对地址命令... 查看详情

以编程方式访问 Graphite 数据的最佳方式是啥? [关闭]

】以编程方式访问Graphite数据的最佳方式是啥?[关闭]【英文标题】:WhatisthebestwaytoaccessGraphitedataprogrammatically?[closed]以编程方式访问Graphite数据的最佳方式是什么?[关闭]【发布时间】:2013-12-0302:41:02【问题描述】:从Graphite渲染A... 查看详情

微信小程序怎么修改支付方式

...管理界面中,点击“设置-支付设置”,可以看到“支付方式”;2、点击“支付方式”,可以看到“支付宝支付”和“微信支付”两种支付方式,可以根据自己的需要,选择其中一种支付方式;3、勾选所需要的支付方式,然后点... 查看详情

从应用程序以编程方式调用 siri 快捷方式

】从应用程序以编程方式调用siri快捷方式【英文标题】:Programmaticallycallingsirishortcutfromapp【发布时间】:2019-03-2614:49:35【问题描述】:我目前正在计划使用NFC标签和iOS快捷方式的iOS应用。想法是,一旦扫描了NFC标签,就会触发... 查看详情

httpget方式提交与post方式提交

GET方式提交1)地址栏(URI)会跟上参数数据,以?开始,多个参数之间以&分隔;2)GET提交参数数据有限制,不超过1K;3)GET方式不适合提交敏感信息,如密码;4)浏览器默认直接访问的请求提交方式为GET。POST方式提交1)参... 查看详情

串口工作方式

一、方式0  方式0时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。... 查看详情

textmisatajosdetecladosnippeetssnippet快捷方式快捷方式(代码片段)

查看详情

get方式和set方式提交时乱码

request.setChracterEncoding("utf-8");只对form表单的post提交方式有效。当使用get提交的时候:  查看详情

桌面快捷方式如何创建

参考技术A  通过添加软件位置创建桌面快捷方式。  1、在桌面右击点击“新建”,点击“创建快捷方式”。  2、点击“浏览”,任意选择软件的图标,浏览需要创建的快捷方式。  3、输入快捷方式的名称,点击完成... 查看详情