我们知道,在WPF里,MSDN提供了三种方法

1.使用转换器Converter

2.继承ListView类,自己处理

3.使用StyleSelctor

到了WinRT的世界了

1. Winrt中Setter不能Binding,需要找办法解决,正在找办法解决(已经找到解决方法,请参看WinRT ListView间隔变色(二))

2.继承类肯定是可以的。就不尝试了

3.使用ItemContainerStyleSelector

我们从第三种开始做起:

在Winrt中,我们没有办法直接重写SelectStyle构造函数了,好在天无绝人之路。WinRt贴心的提供了SelectStyleCore函数。

  1. protected virtual Style SelectStyleCore(System.Object item, DependencyObject container);

接下来我们就重写这个函数就好

  1. protected override Style SelectStyleCore(object item, DependencyObject container)
  2. {
  3. var style = new Style {TargetType = typeof (ListViewItem)};
  4. var backgroudSetter = new Setter {Property = Windows.UI.Xaml.Controls.Control.BackgroundProperty};
  5.  
  6. var listview = ItemsControl.ItemsControlFromItemContainer(container) as ListView;
  7. if (listview != null)
  8. {
  9. var index = listview.IndexFromContainer(container);
  10. backgroudSetter.Value = index%== ? EvenColorBrush : OddColorBrush ;
  11. }
  12. style.Setters.Add(backgroudSetter);
  13.  
  14. return style;
  15. }

这里,我们定义了连个Brush( EvenColorBrush ,OddColorBrush),方便我们后来修改

  1. public SolidColorBrush OddColorBrush { get; set; }
  2. public SolidColorBrush EvenColorBrush { get; set; }

我们把这个StylesSecltor命名为ListViewItemStyleSelector;在资源文件里使用

  1. <converter:ListViewItemStyleSelector x:Key="ListViewItemStyleSelector" OddColorBrush="{StaticResource SilverColorBrush}" EvenColorBrush="{StaticResource AsbestosColorBrush}"/>

其中,converter前缀为ListViewItemStyleSelector所在的命名空间。

最后,我们在项目中使用这个Selector,

  1. <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

摘录主要代码如下:

  1. namespace Behaviors
  2. {
  3. public class AlternatingColorItemContainerStyleSelector : StyleSelector
  4. {
  5. private Style _oddStyle = new Style { TargetType = typeof(ListViewItem) }, _evenStyle = new Style { TargetType = typeof(ListViewItem) };
  6. public Style OddStyle { get { return _oddStyle; } }
  7. public Style EvenStyle { get { return _evenStyle; } }
  8.  
  9. protected override Style SelectStyleCore(object item, DependencyObject container)
  10. {
  11. var listViewItem = (ListViewItem)container;
  12. var listView = GetParent<ListView>(listViewItem);
  13.  
  14. var index = listView.IndexFromContainer(listViewItem);
  15.  
  16. if (index % == )
  17. {
  18. return this.EvenStyle;
  19. }
  20. else
  21. {
  22. return this.OddStyle;
  23. }
  24. }
  25.  
  26. public static T GetParent<T>(DependencyObject child) where T : DependencyObject
  27. {
  28. while (!(child is T))
  29. {
  30. child = VisualTreeHelper.GetParent(child);
  31. }
  32.  
  33. return (T)child;
  34. }
  35. }
  36.  
  37. public class ListViewAlternatingColorBehavior : DependencyObject, IBehavior
  38. {
  39. public DependencyObject AssociatedObject { get; set; }
  40.  
  41. public Style SharedItemContainerStyle { get; set; }
  42.  
  43. #region colors dp
  44.  
  45. public SolidColorBrush OddBrush
  46. {
  47. get { return (SolidColorBrush)GetValue(OddBrushProperty); }
  48. set { SetValue(OddBrushProperty, value); }
  49. }
  50.  
  51. public static readonly DependencyProperty OddBrushProperty =
  52. DependencyProperty.Register("OddBrush", typeof(SolidColorBrush), typeof(ListViewAlternatingColorBehavior), new PropertyMetadata(null));
  53.  
  54. public SolidColorBrush EvenBrush
  55. {
  56. get { return (SolidColorBrush)GetValue(EvenBrushProperty); }
  57. set { SetValue(EvenBrushProperty, value); }
  58. }
  59.  
  60. public static readonly DependencyProperty EvenBrushProperty =
  61. DependencyProperty.Register("EvenBrush", typeof(SolidColorBrush), typeof(ListViewAlternatingColorBehavior), new PropertyMetadata(null));
  62.  
  63. #endregion
  64.  
  65. public void Attach(DependencyObject associatedObject)
  66. {
  67. this.AssociatedObject = associatedObject;
  68.  
  69. this.ApplyItemContainerStyleSelectors();
  70. }
  71.  
  72. private void ApplyItemContainerStyleSelectors()
  73. {
  74. var itemContainerStyleSelector = new AlternatingColorItemContainerStyleSelector();
  75.  
  76. if (this.SharedItemContainerStyle != null)
  77. {
  78. itemContainerStyleSelector.OddStyle.BasedOn = this.SharedItemContainerStyle;
  79. itemContainerStyleSelector.EvenStyle.BasedOn = this.SharedItemContainerStyle;
  80. }
  81.  
  82. itemContainerStyleSelector.OddStyle.Setters.Add(new Setter { Property = Control.BackgroundProperty, Value = this.OddBrush });
  83. itemContainerStyleSelector.EvenStyle.Setters.Add(new Setter { Property = Control.BackgroundProperty, Value = this.EvenBrush });
  84.  
  85. var listView = (ListView)this.AssociatedObject;
  86. listView.ItemContainerStyleSelector = itemContainerStyleSelector;
  87. }
  88.  
  89. public void Detach()
  90. {
  91. }
  92. }
  93. }

使用时如下:

  1. <interactivity:Interaction.Behaviors>
  2. behaviors:ListViewAlternatingColorBehavior EvenBrush="Red" OddBrush="Green"/>
  3. </interactivity:Interaction.Behaviors>

WinRT ListView间隔变色(一)的更多相关文章

  1. WinRT ListView间隔变色(二)

    上文说到,WinRt中,我们不能在Style的Setter使用Binding.这个问题其实从SL5之前,一直都不可以.但是,为了使用强大的Binding,人们也一直想使用各种方法来达到Binding ...

  2. wpf listview 行变色

    <ListView x:Name="listView_Date" Grid.Row="3" BorderBrush="{x:Null}" ...

  3. ListView间隔设置颜色

    在Adapter的getView中 if (position % 2 == 0) holder.shoucangbt.setBackgroundColor( Color.rgb(246, 246, 2 ...

  4. ListView的基本使用技巧

    ListView的基本使用技巧 1.headerView和footerView 2.ViewHolder 3.OnScrollListener 4.单行刷新 5.其它细节 ListView提供head ...

  5. GridView

    1.设置间隔变色 css: .oddRow{ background:#fafafa; } js: ,loadComplete:function(){ $("tr.jqgrow:odd&quo ...

  6. Android开发颜色大全

    <!-- dialog背景颜色 --> <color name=</color> <color name="white">#FFFFFF& ...

  7. Android 点击ListView(或GridView)的一个item,使其里面textview变色,点击另一个这个恢复原来颜色

    今天作一个项目,就是做视频app,如果电视剧的话有许多剧集,点击一个item,播放不同的剧集,要有点击效果,并且默认是选择第一个.花费了一段时间,自己觉得有点难 度,现在和大家分享一下,下面是效果显示 ...

  8. ListView防止滑动变色的小技巧

    listview滑动时会变成白色,如果背景色不是白色的话可以通过设置setCacheColorHint(Color.TRANSPARENT);来避免变色,.对应的xml也可以进行设置.

  9. 设置ListView每条数据之间的间隔

    1:如果不需要分割线可以在xml布局文件中ListView下设置XML属性: android:divider="#00000000" android:dividerHeight=& ...

随机推荐

  1. Symantec Backup Exec部署手册

    转载  http://xiaxiaoguo.blog.51cto.com/858884/402810 Symantec Backup Exec部署手册 目录 1.Backup Exec 12.5安装. ...

  2. C# 控制台程序如何输出Messagebox

    1 添加如下引用   2 添加引用和Messagebox的代码.   3 测试可行                

  3. C++ Primer高速入门之五:有用的模板库

    更新:又一次排版代码格式 除上篇博客介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类 型标准库. 包含 string 和 vector,它们分别定义了字符串和矢量(集合).string ...

  4. openstack (3)---------部署memcached缓存服务,keystone服务

    一.memcached概念 Memcached 是一个开源的.高性能的分布式内存对象缓存系统.通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高网站访问速度,加速动态WEB应用.减轻数据库负载 ...

  5. hiho一下 第五十一周(有向图欧拉路径)51

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  6. Guava ---- EventBus事件驱动模型

    在软件开发过程中, 难免有信息的共享或者对象间的协作. 怎样让对象间信息共享高效, 而且耦合性低. 这是一个难题. 而耦合性高将带来编码改动牵一发而动全身的连锁效应. Spring的风靡正是由于攻克了 ...

  7. ZOJ 3609 Modular Inverse(扩展欧几里德)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712 The modular modular multiplicat ...

  8. bzoj4195 [Noi2015]程序自动分析——并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集 ...

  9. linux下的C语言开发 GDB的例子

    在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...

  10. 4. extjs中form中的frame:true表示什么

    转自:https://blog.csdn.net/qiu512300471/article/details/23737217 设置为true时可以为panel添加背景色.圆角边框等,如下图 下面的是f ...