繁体   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