2011-04-06 34 views
0

視窗7(64位),.NET 4(32位應用程序)子類的ListView列0顯示在Windows損壞的文本7

我具有包括2列的子類System.Windows.Forms.ListView在顯示 「細節「視圖。只涉及文本字段。該列表包含約100 行。在初始顯示時,所有字段都被清晰地繪製,但當滾動或滾動時,第一列中某些字段的文本變爲 不可讀。它似乎被隨機線條和斑點覆蓋。

有什麼我可以做的,以確保文本清晰地繪製在0列?

當通過局域網使用遠程桌面時,效果會降低(清晰度得到改善)。 當在WAN上使用遠程桌面 時,效果消失(所有文本都清晰地繪製)。

ListView在Windows XP上總是繪製得很完美。

出於剝離測試的目的,列標題和DrawItem調用是根據。該方面的問題是OnDrawSubItem包括代碼

protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e) 
{ 
    using (StringFormat sf = new StringFormat(StringFormatFlags.NoWrap)) 
    { 
     Rectangle rect = new Rectangle(e.Bounds.Left 
      ,e.Bounds.Top, e.Bounds.Width, e.Bounds.Height); 
     e.Graphics.DrawString(e.SubItem.Text, this.Font, Brushes.Black 
      ,rect, sf); 
    } 
    base.OnDrawSubItem(e); 
} 

下面是再現問題的完整代碼:

using System; 
using System.Windows.Forms; 
using System.Drawing; 
/// 
/// Build by saving to a file called LVTrial.cs and then executing "csc LVTrial.cs" 
/// Scroll list up and down on a windows 7 box and the first column of text is corrupted. 
/// 

class MyListView : ListView 
{ 
    Random randomiser = new Random(); 
    private const int NUM_ROWS = 100; 
    private const int NUM_COLS = 2; 
    public MyListView() 
    { 
     this.Location = new System.Drawing.Point(23, 25); 
     this.OwnerDraw = true; 
     this.Size = new System.Drawing.Size(625, 387); 
     this.TabIndex = 0; 
     this.UseCompatibleStateImageBehavior = false; 
     this.View = System.Windows.Forms.View.Details; 
     for (int ii = 0; ii < NUM_COLS; ii++) 
     { 
      this.Columns.Add((
       (System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()))); 
     } 
     for (int ii = 0; ii < NUM_ROWS; ii++) 
     { 
      this.Items.Add(new ListViewItem( 
       new string[NUM_COLS] { CreateRandomString(1, 6), CreateRandomString(1, 6) })); 
     } 
    } 
    protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e) 
    { 
     using (StringFormat sf = new StringFormat(StringFormatFlags.NoWrap)) 
     { 
      Rectangle rect = new Rectangle(e.Bounds.Left 
       ,e.Bounds.Top, e.Bounds.Width, e.Bounds.Height); 
      e.Graphics.DrawString(e.SubItem.Text, this.Font, Brushes.Black 
       ,rect, sf); 
     } 
     base.OnDrawSubItem(e); 
    } 
    private string CreateRandomString(int minLength, int maxLength) 
    { 
     string str = string.Empty; 
     int length = randomiser.Next(minLength, maxLength + 1); 
     for (int ii = 0; ii < length; ii++) 
     { 
      int asciiChar = randomiser.Next(32, 126); // ascii range 
      str += Convert.ToChar(asciiChar); 
     } 
     return str; 
    } 
} 

class LVTrial : Form 
{ 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new LVTrial()); 
    } 
    private LVTrial() 
    { 
     MyListView myListView = new MyListView(); 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(674, 440); 
     this.Controls.Add(myListView); 
     this.Text = "LVTrial"; 
    } 
} 

回答

1

我在https://connect.microsoft.com/VisualStudio/feedback/details/657909/subclassed-listview-column-0-displays-corrupted-text-on-windows-7

記錄本作爲Windows 7的錯誤我問題的自己的解決方法是在位置0插入一個額外的列。現在我爲每個項目在第0列用透明畫筆繪製一個矩形。所有這些都會停止右側列中的文本被損壞。我想繪製圖像會達到同樣的效果,但我沒有嘗試過。由於問題僅轉移到第二列(即第一個可見的冷柱),因此無法隱藏此虛擬列。

另一個提示是它似乎與性能有關。列表視圖中的100個項目比10,000個更有可能發生錯誤。