7

少し背景:私はWPFからWinFormsへの変換者であり、しばらくの間、アプリケーションを移行してきました。

友人から、私のコードはWindows 7(私が開発したもの)では正常に動作するにもかかわらず、Windows XPでは動作しない(起動時にスタックオーバーフローが発生する)と報告されました。

少し調べたところ、問題の原因は次のようなものでした。

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

明らかに悪い決定に気付いたので、なぜそれがWindowsXPで機能しないのか不思議に思っていませんでした。なぜそれがWindows7で動作するのか疑問に思いました。

明らかに、ある時点でコンパイラは私がやろうとしていることを理解し、同じイベントが何度も発生するのを防ぎますが、私はむしろ何もしないようにしたいので、バグを確認してつぶすことができます2つのプラットフォームで同時にテストするのではなく、開発中のプラットフォーム。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;
   }
}

最初のアイテムで、選択を1回だけ設定します。問題は、それが永続的なループに入る可能性が高いことです。

Windows 7がXPよりも寛容である理由については、私には言えませんでした。LVM_*メッセージが処理される順序などである可能性があります。

于 2012-09-28T11:10:46.163 に答える
2

.NETバージョンが違いを生むかどうかを確認してください。XPよりもWindows7マシンに新しいバージョンの.NETがある場合(非常に可能性が高い)、以前のバージョンをターゲットにしている場合でも、違いが生じる可能性があります。

.NETの下位互換性についてMSDNが述べていることを参照してください。

于 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);
}

OS固有の外観を編集:o

于 2012-09-28T11:05:14.597 に答える