c# listView闪烁/可选颜色

本文关键字:颜色 listView 闪烁 | 更新日期: 2023-09-27 18:15:17

是否可以在c#中动画ListView项目?这样做的目的是,我有一个异步修改的ListView,并且我希望将已修改的项目流畅地动画化,直到用户单击它们。通过这种方式,闪烁的项目,或者其他任何有效果的项目,都是那些还没有被检查过的项目。

谢谢大家!

更新:对不起,我忘了。以前从未使用过WPF,我认为现在切换到WPF已经太晚了。

c# listView闪烁/可选颜色

我不得不做一些类似于你正在尝试做的事情,但不是动画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的initialize方法。您需要在这里操作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类型,因此您可以单独操作它。

希望这能给你一些指导:)

您可以使用MyListView: ListView并覆盖OnDrawSubItem。有e.Item.Tag来存储"点击"状态,并根据其状态更新背景。

   public partial class ObjectListView : ListView  {  
(....)    
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
      if(bool)e.Item.Tag)
        (...) animate
}

在WPF中更容易做到。

WPF基本

    http://msdn.microsoft.com/en-us/library/ms754130.aspx
  1. http://en.wikipedia.org/wiki/Windows_Presentation_Foundation

WPF动画

http://msdn.microsoft.com/en-us/library/ms752312.aspx

ListView动画示例

  1. (WPF) Animate ListView item move

  2. WPF ListView动画重新排序的项目?