如何为ItemsControl行制作交替背景颜色(Silverlight)?

8
如何为 ItemsControl 的行创建交替的背景色?

1
请查看此帖子 - Bala R
2个回答

6

这不是ItemsControl的内置函数。你可以通过扩展ItemsControl来实现需求。

一个不错的例子可以在这里找到。


2
我从 Joe McBride 那里取得了代码,并将其概括为可以让您指定要设置的属性(默认为Background)以及在交替之前每种颜色的行数(默认为1),而且不需要任何外部文件。
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;

namespace Converters
{
    public class AlternatingRowConverter : IValueConverter
    {
        public Brush NormalBrush { get; set; }
        public Brush AlternateBrush { get; set; }
        public int AlternateEvery { get; set; }
        public string Property { get; set; }

        public AlternatingRowConverter()
        {
            AlternateEvery = 1;
            Property = "Background";
        }

        public object Convert(
            object value, Type targetType, object parameter, CultureInfo culture)
        {
            var element = (FrameworkElement)value;
            element.Loaded += Element_Loaded;

            return NormalBrush;
        }

        public object ConvertBack(
            object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        private void Element_Loaded(object sender, RoutedEventArgs e)
        {
            var element = (FrameworkElement)sender;

            DependencyObject obj = element;
            do
            {
                obj = VisualTreeHelper.GetParent(obj);
            } while (!(obj is ItemsControl) && obj != null);

            var parent = (ItemsControl)obj;
            if (parent != null)
            {
                DependencyObject container =
                    parent.ItemContainerGenerator.ContainerFromItem(
                    element.DataContext);

                if (container != null)
                {
                    int index = parent.ItemContainerGenerator.IndexFromContainer(
                        container);

                    if (index % (AlternateEvery * 2) >= AlternateEvery)
                        element.GetType().GetProperty(Property)
                            .SetValue(element, AlternateBrush, null);
                }
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接