WinRT ListView间隔变色(一)
我们知道,在WPF里,MSDN提供了三种方法
1.使用转换器Converter
2.继承ListView类,自己处理
3.使用StyleSelctor
到了WinRT的世界了
1. Winrt中Setter不能Binding,需要找办法解决,正在找办法解决(已经找到解决方法,请参看WinRT ListView间隔变色(二))
2.继承类肯定是可以的。就不尝试了
3.使用ItemContainerStyleSelector
我们从第三种开始做起:
在Winrt中,我们没有办法直接重写SelectStyle构造函数了,好在天无绝人之路。WinRt贴心的提供了SelectStyleCore函数。
- protected virtual Style SelectStyleCore(System.Object item, DependencyObject container);
接下来我们就重写这个函数就好
- protected override Style SelectStyleCore(object item, DependencyObject container)
- {
- var style = new Style {TargetType = typeof (ListViewItem)};
- var backgroudSetter = new Setter {Property = Windows.UI.Xaml.Controls.Control.BackgroundProperty};
- var listview = ItemsControl.ItemsControlFromItemContainer(container) as ListView;
- if (listview != null)
- {
- var index = listview.IndexFromContainer(container);
- backgroudSetter.Value = index%== ? EvenColorBrush : OddColorBrush ;
- }
- style.Setters.Add(backgroudSetter);
- return style;
- }
这里,我们定义了连个Brush( EvenColorBrush ,OddColorBrush),方便我们后来修改
- public SolidColorBrush OddColorBrush { get; set; }
- public SolidColorBrush EvenColorBrush { get; set; }
我们把这个StylesSecltor命名为ListViewItemStyleSelector;在资源文件里使用
- <converter:ListViewItemStyleSelector x:Key="ListViewItemStyleSelector" OddColorBrush="{StaticResource SilverColorBrush}" EvenColorBrush="{StaticResource AsbestosColorBrush}"/>
其中,converter前缀为ListViewItemStyleSelector所在的命名空间。
最后,我们在项目中使用这个Selector,
- <ListView ItemsSource="{Binding VM.AuthorPostList}" ItemContainerStyleSelector="{StaticResource ListViewItemStyleSelector}" ItemTemplate="{StaticResource AuthorPostDetailItemDataTemplate}" Grid.Row=""/>
我们最终效果如下:
接下来,还有第二篇有关间隔变色的问题 WinRT ListView间隔变色(二)
写完这个,经高手提醒,还可以用Behavior来做
Alternating Colors of rows in ListView in Windows Phone 8.1
摘录主要代码如下:
- namespace Behaviors
- {
- public class AlternatingColorItemContainerStyleSelector : StyleSelector
- {
- private Style _oddStyle = new Style { TargetType = typeof(ListViewItem) }, _evenStyle = new Style { TargetType = typeof(ListViewItem) };
- public Style OddStyle { get { return _oddStyle; } }
- public Style EvenStyle { get { return _evenStyle; } }
- protected override Style SelectStyleCore(object item, DependencyObject container)
- {
- var listViewItem = (ListViewItem)container;
- var listView = GetParent<ListView>(listViewItem);
- var index = listView.IndexFromContainer(listViewItem);
- if (index % == )
- {
- return this.EvenStyle;
- }
- else
- {
- return this.OddStyle;
- }
- }
- public static T GetParent<T>(DependencyObject child) where T : DependencyObject
- {
- while (!(child is T))
- {
- child = VisualTreeHelper.GetParent(child);
- }
- return (T)child;
- }
- }
- public class ListViewAlternatingColorBehavior : DependencyObject, IBehavior
- {
- public DependencyObject AssociatedObject { get; set; }
- public Style SharedItemContainerStyle { get; set; }
- #region colors dp
- public SolidColorBrush OddBrush
- {
- get { return (SolidColorBrush)GetValue(OddBrushProperty); }
- set { SetValue(OddBrushProperty, value); }
- }
- public static readonly DependencyProperty OddBrushProperty =
- DependencyProperty.Register("OddBrush", typeof(SolidColorBrush), typeof(ListViewAlternatingColorBehavior), new PropertyMetadata(null));
- public SolidColorBrush EvenBrush
- {
- get { return (SolidColorBrush)GetValue(EvenBrushProperty); }
- set { SetValue(EvenBrushProperty, value); }
- }
- public static readonly DependencyProperty EvenBrushProperty =
- DependencyProperty.Register("EvenBrush", typeof(SolidColorBrush), typeof(ListViewAlternatingColorBehavior), new PropertyMetadata(null));
- #endregion
- public void Attach(DependencyObject associatedObject)
- {
- this.AssociatedObject = associatedObject;
- this.ApplyItemContainerStyleSelectors();
- }
- private void ApplyItemContainerStyleSelectors()
- {
- var itemContainerStyleSelector = new AlternatingColorItemContainerStyleSelector();
- if (this.SharedItemContainerStyle != null)
- {
- itemContainerStyleSelector.OddStyle.BasedOn = this.SharedItemContainerStyle;
- itemContainerStyleSelector.EvenStyle.BasedOn = this.SharedItemContainerStyle;
- }
- itemContainerStyleSelector.OddStyle.Setters.Add(new Setter { Property = Control.BackgroundProperty, Value = this.OddBrush });
- itemContainerStyleSelector.EvenStyle.Setters.Add(new Setter { Property = Control.BackgroundProperty, Value = this.EvenBrush });
- var listView = (ListView)this.AssociatedObject;
- listView.ItemContainerStyleSelector = itemContainerStyleSelector;
- }
- public void Detach()
- {
- }
- }
- }
使用时如下:
- <interactivity:Interaction.Behaviors>
- behaviors:ListViewAlternatingColorBehavior EvenBrush="Red" OddBrush="Green"/>
- </interactivity:Interaction.Behaviors>
WinRT ListView间隔变色(一)的更多相关文章
- WinRT ListView间隔变色(二)
上文说到,WinRt中,我们不能在Style的Setter使用Binding.这个问题其实从SL5之前,一直都不可以.但是,为了使用强大的Binding,人们也一直想使用各种方法来达到Binding ...
- wpf listview 行变色
<ListView x:Name="listView_Date" Grid.Row="3" BorderBrush="{x:Null}" ...
- ListView间隔设置颜色
在Adapter的getView中 if (position % 2 == 0) holder.shoucangbt.setBackgroundColor( Color.rgb(246, 246, 2 ...
- ListView的基本使用技巧
ListView的基本使用技巧 1.headerView和footerView 2.ViewHolder 3.OnScrollListener 4.单行刷新 5.其它细节 ListView提供head ...
- GridView
1.设置间隔变色 css: .oddRow{ background:#fafafa; } js: ,loadComplete:function(){ $("tr.jqgrow:odd&quo ...
- Android开发颜色大全
<!-- dialog背景颜色 --> <color name=</color> <color name="white">#FFFFFF& ...
- Android 点击ListView(或GridView)的一个item,使其里面textview变色,点击另一个这个恢复原来颜色
今天作一个项目,就是做视频app,如果电视剧的话有许多剧集,点击一个item,播放不同的剧集,要有点击效果,并且默认是选择第一个.花费了一段时间,自己觉得有点难 度,现在和大家分享一下,下面是效果显示 ...
- ListView防止滑动变色的小技巧
listview滑动时会变成白色,如果背景色不是白色的话可以通过设置setCacheColorHint(Color.TRANSPARENT);来避免变色,.对应的xml也可以进行设置.
- 设置ListView每条数据之间的间隔
1:如果不需要分割线可以在xml布局文件中ListView下设置XML属性: android:divider="#00000000" android:dividerHeight=& ...
随机推荐
- Symantec Backup Exec部署手册
转载 http://xiaxiaoguo.blog.51cto.com/858884/402810 Symantec Backup Exec部署手册 目录 1.Backup Exec 12.5安装. ...
- C# 控制台程序如何输出Messagebox
1 添加如下引用 2 添加引用和Messagebox的代码. 3 测试可行
- C++ Primer高速入门之五:有用的模板库
更新:又一次排版代码格式 除上篇博客介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类 型标准库. 包含 string 和 vector,它们分别定义了字符串和矢量(集合).string ...
- openstack (3)---------部署memcached缓存服务,keystone服务
一.memcached概念 Memcached 是一个开源的.高性能的分布式内存对象缓存系统.通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高网站访问速度,加速动态WEB应用.减轻数据库负载 ...
- hiho一下 第五十一周(有向图欧拉路径)51
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- Guava ---- EventBus事件驱动模型
在软件开发过程中, 难免有信息的共享或者对象间的协作. 怎样让对象间信息共享高效, 而且耦合性低. 这是一个难题. 而耦合性高将带来编码改动牵一发而动全身的连锁效应. Spring的风靡正是由于攻克了 ...
- ZOJ 3609 Modular Inverse(扩展欧几里德)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712 The modular modular multiplicat ...
- bzoj4195 [Noi2015]程序自动分析——并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集 ...
- linux下的C语言开发 GDB的例子
在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...
- 4. extjs中form中的frame:true表示什么
转自:https://blog.csdn.net/qiu512300471/article/details/23737217 设置为true时可以为panel添加背景色.圆角边框等,如下图 下面的是f ...