7

一点背景知识:我是 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 上运行

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

是否有某种编译器标志?

4

3 回答 3

4

尝试这个:

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

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

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

于 2012-09-28T11:10:46.163 回答
2

检查并查看 .NET 版本是否有任何不同。如果您的 Windows 7 机器上的 .NET 版本比 XP 上的新版本(很可能),那么即使您的目标是较早的版本,也可能存在差异。

查看MSDN 关于 .NET 向后兼容性的说明

于 2012-09-28T11:11:21.590 回答
1

这可能有效(未测试)

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

于 2012-09-28T11:05:14.597 回答