为什么此代码适用于Windows 7,但不适用于Windows XP?

Kur*_*raj 7 .net c# windows listview winforms

一点背景:我是WPF到WinForms转换器,有一段时间我一直在迁移我的应用程序.

我的朋友报告说我的代码在Windows XP上不起作用(它在启动时会产生堆栈溢出),即使它在Windows 7(我开发的)上工作正常.

经过一番研究后,导致问题的原因是:

 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
 {
     listView1.SelectedIndices.Clear();
     listView1.Items[0].Selected = true;
 }
Run Code Online (Sandbox Code Playgroud)

现在我注意到了明显不好的决定,我不知道为什么它在Windows XP上不起作用.我想知道它为什么在Windows 7上运行.

很明显,在某些时候,编译器会弄清楚我正在尝试做什么,并防止同一事件一次又一次地被触发,但我宁愿让它什么都不做,所以我可以看到并挤压看到的bug.我正在开发的平台,而不是必须同时在两个平台下测试它.回到WPF我可以通过将e.Handled设置为'true'来手动处理这种行为,在WinForms中显然没有这样的事情.

是否有某种编译器标志?

Llo*_*oyd 4

尝试这个:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
   if (!listView1.Items[0].Selected) {
       listView1.SelectedIndices.Clear();
       listView1.Items[0].Selected = true;
   }
}
Run Code Online (Sandbox Code Playgroud)

您只想在第一个项目上设置一次选择。问题是它可能会陷入永久循环。

至于为什么 Windows 7 比 XP 更宽容,我不能说。可能是 LVM_* 消息的处理顺序或其他任何内容。