Как сделать чередующийся цвет фона для строк ItemsControl (Silverlight)? - PullRequest
8 голосов
/ 26 февраля 2011

Как сделать чередующийся цвет фона для строк ItemsControl?

Ответы [ 2 ]

6 голосов
/ 26 февраля 2011

Это не встроенная функция ItemsControl. что вы можете сделать, это продлить ItemsControl для требования.

Хороший пример можно найти по здесь

2 голосов
/ 05 марта 2011

Я взял код от Джо МакБрайда и обобщил его, чтобы вы могли указать, какое свойство устанавливать (по умолчанию 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);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...