C # listView Blink / альтернативный цвет - PullRequest
2 голосов
/ 18 ноября 2011

Можно ли анимировать ListView элементов в C #? Цель состоит в том, чтобы у меня был ListView, который асинхронно изменен, и я бы хотел плавно анимировать измененные элементы, пока пользователь не щелкнет по ним. Таким образом, элементы, мигающие, или что-то еще, срабатывают, это элементы, которые изменились и еще не были рассмотрены.

Спасибо, ребята!

ОБНОВЛЕНИЕ: извините, я забыл. Никогда раньше не использовал WPF, и я думаю, что уже слишком поздно переключаться на него. Я использую winforms.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Мне пришлось сделать что-то похожее на то, что вы пытаетесь сделать, но вместо анимации ListView, я использовал настраиваемый макет флажка в представлении списка, чтобы выглядеть по-другому. Код конструктора для ListView выглядит следующим образом:

        this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
        this.listView1.Location = new System.Drawing.Point(104, 90);
        this.listView1.MultiSelect = false;
        this.listView1.Name = "listView1";
        this.listView1.Size = new System.Drawing.Size(264, 105);
        this.listView1.Sorting = System.Windows.Forms.SortOrder.Ascending;
        this.listView1.TabIndex = 7;
        this.listView1.UseCompatibleStateImageBehavior = false;
        this.listView1.View = System.Windows.Forms.View.Details;
        this.listView1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseClick);

Тогда я объявил список, который будет содержать выбор пользователя.

    private IList<ListViewItem> m_CheckedItems = new List<ListViewItem>();

Вот метод инициализации для ListView. Вам нужно манипулировать здесь для первоначального вида вашего списка.

    private void InitialiseListView(IList<string> data)
    {
        listView1.Items.Clear();
        m_CheckedItems.Clear();
        listView1.Columns.Clear();
        listView1.Columns.Add("Col1");
        listView1.Columns[0].Width = listView1.Width;
        ListView.ListViewItemCollection collection = new ListView.ListViewItemCollection(listView1);
        ImageList images = new ImageList();
        images.Images.Add(global::MyApplication.Properties.Resources.Checkbox_Unchecked);
        images.Images.Add(global::MyApplication.Properties.Resources.Checkbox_Checked);
        listView1.SmallImageList = images;
        foreach (string str in data)
        {
            ListViewItem item = new ListViewItem();
            item.ImageIndex = 0;
            item.Text = str;
            collection.Add(item);
        }
    }

Это событие срабатывает, когда пользователь выбирает параметр в представлении списка. Выбор записывается в список, который я создал выше, и проверенное изображение отображается так, как будто пользователь выбрал элемент.

    private void listView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left && listView1.FocusedItem != null)
        {
            if (listView1.FocusedItem.ImageIndex == 1)
            {
                listView1.FocusedItem.ImageIndex = 0;
                m_CheckedItems.Remove(listView1.FocusedItem);
            }
            else
            {
                listView1.FocusedItem.ImageIndex = 1;
                m_CheckedItems.Add(listView1.FocusedItem);
            }
        }
    }

Вероятно, вы можете поиграть со шрифтами и передним цветом этих элементов ... Каждый элемент в представлении списка имеет тип ListViewItem, поэтому вы можете индивидуально манипулировать им.

Надеюсь, это даст вам некоторое направление:)

1 голос
/ 18 ноября 2011

Вы можете использовать MyListView: ListView и переопределить OnDrawSubItem.Имейте e.Item.Tag, чтобы сохранить состояние "Clicked" и обновить фон в соответствии с его состоянием.

   public partial class ObjectListView : ListView  {  
(....)    

protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
      if(bool)e.Item.Tag)
        (...) animate
}
...