簡體   English   中英

為什么此代碼適用於Windows 7,但不適用於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM