2011-08-19 30 views
0

我認爲在System.Windows.Forms.VisualStyles.VisualStyleRenderer.GetPartSize()中有一個錯誤。win7中的Windows.Forms.VisualStyles.VisualStyleRenderer.GetPartSize()中的可疑錯誤

通過此發現link。我創建了一個調用此方法的示例控制檯應用程序,並將返回的Size對象的寬度和高度打印到控制檯。下面是我們的一些辦公室的結果:

  • Vista的:寬= 20,身高= 21
  • XP:寬= 15,身高= 20
  • Win7的:寬= 7,高度= 21 < - - 返回的寬度是錯誤的

的代碼如下所示:

var element = VisualStyleElement.ComboBox.DropDownButton.Normal; 
var renderer = new System.Windows.Forms.VisualStyles.VisualStyleRenderer(element); 

var control = new Control(); 
using (var gr = control.CreateGraphics()) 
{ 
    var size = renderer.GetPartSize(gr, ThemeSizeType.True); 
    Console.WriteLine(String.Format("Width={0},Height={1}", size.Width, size.Height)); 
} 

我不能在網路上找到任何東西表明這是AK未知的問題。任何理由懷疑它不是?!

更重要的是,你認爲只檢查操作系統是否爲Win7並返回正確的大小是安全的?

回答

2

這就是我得到太多,7×21:

enter image description here

是啊,這是箭頭正好寬7個像素。因爲它們不是跨操作系統兼容

 var left = VisualStyleElement.CreateElement("COMBOBOX", 7, 1); 
     var right = VisualStyleElement.CreateElement("COMBOBOX", 6, 1); 

目前在.NET 4中,但隱藏的:如果你要測量尺寸的左側和箭頭的右側,那麼你可以使用這些元素。我的機器上的值分別是(6,21)和(5,21)。

+0

但是高度不是21像素嗎?!仍然不確定爲什麼在XP上它的15x16,Vista 20x21和Win7 7x21 - 這個比例都是錯誤的...... – JohnBarton

+0

Erm,你接受了'這是一個錯誤'的答案。我向你展示瞭如何達到18x21的測量。如果你不想使用它,那麼祝你好運。 –

+0

對不起,我當時並沒有真正讚賞你的答案。回過頭來看,是的 - 你確實回答了我的問題,並給了我一個解決方法。非常感謝。 – JohnBarton

1

至少有一個其他人the same problem

有了足夠的耐心,你可以看看一些着名的開源渲染引擎(如WebKit,Gecko,Chrome),瞭解它們如何渲染下拉按鈕(例如作爲組合框的一部分)。由於他們在Windows 7上看起來正確,所以必須有一種解決方法或者您正在做某事。不同。

+0

感謝您的鏈接,我將不得不看看是否值得花時間深入挖掘,或者只是檢查操作系統。 – JohnBarton

2

聲音與Microsoft Connect上此bug report中的問題類似。

+0

謝謝,那確實看起來像是同樣的問題。歡呼找到鏈接 – JohnBarton

+0

這是一個來自* 2005 * –

+0

@Hans的錯誤報告 - 我注意到了,但它仍然表示Active,並且存在一些錯誤,有時會出現更長的時間,所以我認爲這可能是相關的。然而,它是在你寫下你的答案之前編寫的,看起來更相關:) –