代码之家  ›  专栏  ›  技术社区  ›  Serge Wautier

如何在ListView中回收影像房地产?

  •  0
  • Serge Wautier  · 技术社区  · 16 年前

    环境:与2008年相比,.NET 2.0,WinForms

    我有一个平铺模式的列表视图。某些项目具有关联的图像。有些人没有。

    当用户单击某些控件时,内容(ListView项)通常会被更新。当发生这种情况时,有时似乎没有新项目有图像。在这种情况下,我希望去掉为图像保留的项目左侧的空白空间。我试着用下面的伪代码暂时去掉图像列表

    list.Items.Clear();
    FillList();
    list.LargeImageList= (none of the items has image) ? null : MyImageList;
    

    但它不起作用:空的空间还在那里。 我也尝试重新粉刷控制,但没有用。

    alt text http://apptranslator.com/_so/so_list1.jpg alt text http://apptranslator.com/_so/so_list2.jpg alt text http://apptranslator.com/_so/so_list3.jpg

    左:图像列表。

    中间:没有图像的列表。图像空间可见。

    对:如果没有图像,我希望它是怎样的。

    编辑: 我也做了这个测试:不要在设计器中分配图像列表。 如果第一个显示不包含任何图像,那么我会得到预期的结果。 然后我单击以显示图像(我得到它们)。我再次单击以返回到无图像选择:图像空间不会消失。

    另外,has,no,我不使用小图像或状态图像。只有大图像。

    我能做什么?短暂性脑缺血发作

    3 回复  |  直到 15 年前
        1
  •  1
  •   Hath    16 年前

    你确定?我让它在这个测试用例中工作:

    using System;
    using System.Windows.Forms;
    public class MainForm : Form
    {
        private System.ComponentModel.IContainer components = null;
        private System.Windows.Forms.ListView listView;
        private System.Windows.Forms.ImageList emptySmallImageList;
        private System.Windows.Forms.ImageList largeImageList;
        private System.Windows.Forms.Button imageListSmallButton;
        private System.Windows.Forms.Button imageListLargeButton;
    
        public MainForm()
        {
            InitializeComponent();
        }
    
        private void OnImageListSmallButtonClick(object sender, EventArgs e)
        {
            this.listView.LargeImageList = emptySmallImageList;       
        }
    
        private void OnImageListLargeButtonClick(object sender, EventArgs e)
        {
            this.listView.LargeImageList = largeImageList;
        }
    
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("fgsdfg");
            System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem("sdfgsdfg");
            System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem("sdfgsdfgsdfg");
            System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem("sdfgsdfg");
            this.listView = new System.Windows.Forms.ListView();
            this.largeImageList = new System.Windows.Forms.ImageList(this.components);
            this.emptySmallImageList = new System.Windows.Forms.ImageList(this.components);
            this.imageListSmallButton = new System.Windows.Forms.Button();
            this.imageListLargeButton = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // listView
            // 
            this.listView.Dock = System.Windows.Forms.DockStyle.Fill;
            this.listView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
            listViewItem5,
            listViewItem6,
            listViewItem7,
            listViewItem8});
            this.listView.LargeImageList = this.largeImageList;
            this.listView.Location = new System.Drawing.Point(0, 0);
            this.listView.Name = "listView";
            this.listView.Size = new System.Drawing.Size(292, 266);
            this.listView.TabIndex = 0;
            this.listView.UseCompatibleStateImageBehavior = false;
            this.listView.View = System.Windows.Forms.View.Tile;
            // 
            // largeImageList
            // 
            this.largeImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
            this.largeImageList.ImageSize = new System.Drawing.Size(32, 32);
            this.largeImageList.TransparentColor = System.Drawing.Color.Transparent;
            // 
            // emptySmallImageList
            // 
            this.emptySmallImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
            this.emptySmallImageList.ImageSize = new System.Drawing.Size(1, 1);
            this.emptySmallImageList.TransparentColor = System.Drawing.Color.Transparent;
            // 
            // imageListSmallButton
            // 
            this.imageListSmallButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.imageListSmallButton.Location = new System.Drawing.Point(175, 12);
            this.imageListSmallButton.Name = "imageListSmallButton";
            this.imageListSmallButton.Size = new System.Drawing.Size(95, 23);
            this.imageListSmallButton.TabIndex = 1;
            this.imageListSmallButton.Text = "ImageList 1x1";
            this.imageListSmallButton.UseVisualStyleBackColor = true;
            this.imageListSmallButton.Click += new System.EventHandler(this.OnImageListSmallButtonClick);
            // 
            // imageListLargeButton
            // 
            this.imageListLargeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.imageListLargeButton.Location = new System.Drawing.Point(175, 53);
            this.imageListLargeButton.Name = "imageListLargeButton";
            this.imageListLargeButton.Size = new System.Drawing.Size(95, 23);
            this.imageListLargeButton.TabIndex = 2;
            this.imageListLargeButton.Text = "ImageList 32x32";
            this.imageListLargeButton.UseVisualStyleBackColor = true;
            this.imageListLargeButton.Click += new System.EventHandler(this.OnImageListLargeButtonClick);
            // 
            // MainForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.imageListLargeButton);
            this.Controls.Add(this.imageListSmallButton);
            this.Controls.Add(this.listView);
            this.Name = "MainForm";
            this.Text = "Form1";
            this.ResumeLayout(false);
    
        }
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
    

    我让它做你现在看到的,我不明白为什么它不做一个调整…我不知道做一个sendmessage是否能做到这一点,但我不知道它会是什么消息。

    我能看到的最好的工作,如果你这样做:

    imageList1.ImageSize = new Size(1,1);
    

    我创建了一个测试,如果不设置 StateImageList . 你在清理 国家形象学家 也?

        2
  •  0
  •   xpda    15 年前

    如果需要完整的控件,请使用ListView.DrawItem事件。

        3
  •  0
  •   jocull    15 年前

    我最近也有这个问题。我注意到,无论largeImageList的ImageSize设置为什么(或者即使largeImageList为空!),ListView将始终充当largeImageList.ImageSize仍设置为其最后一个值的情况。

    在我的程序中,我根本没有使用smallimagelist,所以一直都是空的。在窗体的构造函数中,我刚刚为ListView将其设置为新的ImageList(),并将大小锁定在(1,1)。问题消失了!看起来像个愚蠢的虫子。

        public frmMain()
        {
            InitializeComponent();
            this.Text = Program.AppName;
    
            lstSightings.SmallImageList = new ImageList();
            lstSightings.SmallImageList.ImageSize = new Size(1, 1);
    
            RefreshItems();
        }