C#列表视图闪烁/可选颜色

C#列表视图闪烁/可选颜色,c#,winforms,listview,listviewitem,C#,Winforms,Listview,Listviewitem,是否可以在C#中设置ListView项目的动画?这样做的目的是我有一个异步修改的ListView,我希望平滑地设置修改过的项目的动画,直到用户单击它们。通过这种方式,闪烁的项目,或者任何能够起到作用的项目,都是尚未被审查的已更改的项目 谢谢你们 更新:对不起,我忘了。以前从未使用过WPF,我认为现在改用它已经太晚了。我正在使用winforms。您可以使用MyListView:ListView并覆盖OnDrawSubItem。使用e.Item.Tag存储“单击”状态并根据其状态更新背景 pu

是否可以在C#中设置
ListView
项目的动画?这样做的目的是我有一个异步修改的ListView,我希望平滑地设置修改过的项目的动画,直到用户单击它们。通过这种方式,闪烁的项目,或者任何能够起到作用的项目,都是尚未被审查的已更改的项目

谢谢你们


更新:对不起,我忘了。以前从未使用过WPF,我认为现在改用它已经太晚了。我正在使用winforms。

您可以使用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基本版

  • WPF动画

    列表视图动画示例


  • 我不得不做一些与您尝试做的类似的事情,但是我没有设置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>();
    
    你可能会摆弄这些项目的字体和前景色。。。列表视图中的每个项目都属于ListViewItem类型,因此您可以单独操作它


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

    wpf还是winforms?在wpf中使用故事板/双动画和一些事件处理应该非常简单抱歉,我忘了。以前从未使用过WPF,我认为现在改用它已经太晚了。我使用的是winforms。建议:除非它非常关键,否则尽量避免直接眨眼。我觉得这很讨厌。在我看来,简单地设置或淡出一种颜色会更好。这是一个要点,这就是为什么我想要一些浅色而不是太疯狂的东西。我更喜欢闪烁,因为有时列表中可能会有一些元素,而将所有元素都着色的新用户可能不会将其视为更新。有一个想法,但恐怕不适合
        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);
                }
            }
        }