Elemental
2007-11-05, 08:08:15
Hallo zusammen,
ich habe ein Problem mit einer ListView. In meiner Anwendung gibt es eine ListView im Details-Modus und immer wenn der Anwender auf eine Spalte klickt, um danach zu sortieren, setzte ich das Property "ImageIndex", um ein Bild im ColumnHeader anzuzeigen. Bei den anderen Spalten setze ich den ImageIndex auf -1, damit kein Bild angezeigt wird.
Das funktioniert unter Windows XP wunderbar, aber unter Windows Vista verschwindet das Bild im ColumnHeader nicht, wenn man den ImageIndex auf -1 setzt:|
Ich hab schon versucht, anstattden ImageIndex auf -1 zusetzen, ein transparentes bitmap anzuzeigen. Funktioniert soweit auch, allerdings ist das recht unschön, weil der Text im Header dann nicht mehr "Left-Aligned" ist...
Hat jemand ne Idee, was die Ursache des Problems sein könnte? Oder vielleicht ein guter Workaround?
Ich hab eine kleine Demo-Applikation geschrieben um das Problem zu testen. Besteht nur aus einem Form mit einer Listview drin:
public partial class Form1 : Form
{
private int m_nColumnNrToDraw = 0;
ImageList m_ImageList;
public Form1()
{
InitializeComponent();
m_ImageList = new ImageList();
listView1.ColumnClick += new ColumnClickEventHandler(listView1_ColumnClick);
//Generate the icon for the headers
Bitmap bmp = new Bitmap(32, 32, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.Magenta, 0, 0, 32, 32);
SolidBrush brushEllipse = new SolidBrush(Color.FromKnownColor(KnownColor.Highlight));
g.FillEllipse(brushEllipse, 10, 10, 10, 10);
Pen pen = new Pen(Color.Gray, 2);
g.DrawEllipse(pen, 5, 5, 20, 20);
bmp.MakeTransparent(Color.Magenta);
m_ImageList.Images.Add(bmp);
//create a second, transparent bitmap
//Bitmap transparentBitmap = new Bitmap(1, 1);
//g = Graphics.FromImage(transparentBitmap);
//g.FillRectangle(Brushes.Magenta, 0, 0, 1, 1);
//transparentBitmap.MakeTransparent(Color.Magenta);
//m_ImageList.Images.Add(transparentBitmap);
listView1.SmallImageList = m_ImageList;
brushEllipse.Dispose();
pen.Dispose();
g.Dispose();
}
void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
//remove icon of previous column
listView1.Columns[m_nColumnNrToDraw].ImageIndex = -1;
m_nColumnNrToDraw = e.Column;
// Set the icon
listView1.Columns[m_nColumnNrToDraw].ImageIndex = 0;
listView1.Refresh();
}
}
ich habe ein Problem mit einer ListView. In meiner Anwendung gibt es eine ListView im Details-Modus und immer wenn der Anwender auf eine Spalte klickt, um danach zu sortieren, setzte ich das Property "ImageIndex", um ein Bild im ColumnHeader anzuzeigen. Bei den anderen Spalten setze ich den ImageIndex auf -1, damit kein Bild angezeigt wird.
Das funktioniert unter Windows XP wunderbar, aber unter Windows Vista verschwindet das Bild im ColumnHeader nicht, wenn man den ImageIndex auf -1 setzt:|
Ich hab schon versucht, anstattden ImageIndex auf -1 zusetzen, ein transparentes bitmap anzuzeigen. Funktioniert soweit auch, allerdings ist das recht unschön, weil der Text im Header dann nicht mehr "Left-Aligned" ist...
Hat jemand ne Idee, was die Ursache des Problems sein könnte? Oder vielleicht ein guter Workaround?
Ich hab eine kleine Demo-Applikation geschrieben um das Problem zu testen. Besteht nur aus einem Form mit einer Listview drin:
public partial class Form1 : Form
{
private int m_nColumnNrToDraw = 0;
ImageList m_ImageList;
public Form1()
{
InitializeComponent();
m_ImageList = new ImageList();
listView1.ColumnClick += new ColumnClickEventHandler(listView1_ColumnClick);
//Generate the icon for the headers
Bitmap bmp = new Bitmap(32, 32, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.Magenta, 0, 0, 32, 32);
SolidBrush brushEllipse = new SolidBrush(Color.FromKnownColor(KnownColor.Highlight));
g.FillEllipse(brushEllipse, 10, 10, 10, 10);
Pen pen = new Pen(Color.Gray, 2);
g.DrawEllipse(pen, 5, 5, 20, 20);
bmp.MakeTransparent(Color.Magenta);
m_ImageList.Images.Add(bmp);
//create a second, transparent bitmap
//Bitmap transparentBitmap = new Bitmap(1, 1);
//g = Graphics.FromImage(transparentBitmap);
//g.FillRectangle(Brushes.Magenta, 0, 0, 1, 1);
//transparentBitmap.MakeTransparent(Color.Magenta);
//m_ImageList.Images.Add(transparentBitmap);
listView1.SmallImageList = m_ImageList;
brushEllipse.Dispose();
pen.Dispose();
g.Dispose();
}
void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
//remove icon of previous column
listView1.Columns[m_nColumnNrToDraw].ImageIndex = -1;
m_nColumnNrToDraw = e.Column;
// Set the icon
listView1.Columns[m_nColumnNrToDraw].ImageIndex = 0;
listView1.Refresh();
}
}