[英]In WPF, why doesn't a ListBox VirtualizingStackPanel work on Windows XP?
[英]Why does this code work on Windows 7, but doesn't on Windows XP?
一點背景:我是WPF到WinForms轉換器,有一段時間我一直在遷移我的應用程序。
我的朋友報告說我的代碼在Windows XP上不起作用(它在啟動時會產生堆棧溢出),即使它在Windows 7(我開發的)上工作正常。
經過一番研究后,導致問題的原因是:
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
listView1.SelectedIndices.Clear();
listView1.Items[0].Selected = true;
}
現在我注意到了明顯不好的決定,我不知道為什么它在Windows XP上不起作用。 我想知道它為什么在Windows 7上運行 。
很明顯,在某些時候編譯器會弄清楚我正在嘗試做什么,並防止同一事件一次又一次地被觸發,但我寧願讓它什么都不做,所以我可以看到並擠壓看到的bug。我正在開發的平台,而不是必須同時在兩個平台下測試它。 回到WPF我可以通過將e.Handled設置為'true'來手動處理這種行為,在WinForms中顯然沒有這樣的事情。
是否有某種編譯器標志?
嘗試這個:
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (!listView1.Items[0].Selected) {
listView1.SelectedIndices.Clear();
listView1.Items[0].Selected = true;
}
}
您只想在第一個項目上設置選擇ONCE。 問題是它可能會進入永久循環。
至於為什么Windows 7比XP更寬容,我不能說。 可以是處理LVM_ *消息的順序或任何內容。
檢查並查看.NET版本是否有任何區別。 如果您的Windows 7計算機上的.NET版本比XP上的版本(很可能),那么即使您的目標是早期版本,也可能存在差異。
了解MSDN對.NET向后兼容性的看法。
這可能有效(未測試)
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if(Environment.OSVersion.Version.Major < 6) listview1.SelectedIndexChanged -= new EventHandler(listView1_SelectedIndexChanged);
listView1.SelectedIndices.Clear();
listView1.Items[0].Selected = true;
if(Environment.OSVersion.Version.Major < 6) listview1.SelectedIndexChanged += new EventHandler(listView1_SelectedIndexChanged);
}
編輯看看它的特定操作系統:o
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.