【问题标题】:C# listView Blink/Alternative ColorC# listView 闪烁/替代颜色
【发布时间】:2011-11-18 11:39:12
【问题描述】:

是否可以在 C# 中为 ListView 项目设置动画?目的是我有一个异步修改的 ListView,并且我想平滑地为已修改的项目设置动画,直到用户单击它们。这样一来,闪烁的项目,或者任何能起到作用的项目,都是尚未审查的已更改项目。

谢谢你们!

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

【问题讨论】:

  • wpf 还是 winforms?在 wpf 中使用 storyboard/doubleanimation 和一些事件处理应该相当简单
  • 对不起,我忘了。以前从未使用过WPF,我认为现在切换到它为时已晚。我正在使用 winforms。
  • 建议:除非是超级关键,否则尽量避免直接眨眼。我会认为这是令人讨厌的。简单地设置或淡化颜色会更好。
  • 这很重要,这就是为什么我想要一些轻松而不是太疯狂的东西。我更喜欢闪灯,因为有时列表中可能会有一些元素,而将所有元素都涂上颜色的新用户可能不会将其视为更新。

标签: c# winforms listview listviewitem


【解决方案1】:

我必须做一些与您尝试做的事情类似的事情,但我没有为 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 类型,因此您可以单独操作它。

希望这能给你一些方向:)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 有一个想法,但恐怕不合适
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 2011-04-29
    • 2015-06-22
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2013-07-08
    相关资源
    最近更新 更多