![](/img/trans.png)
[英]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.