WP TIPS に戻る

高さの違う項目を表示したときの ListBox がたがたスクロール問題とその回避方法

サンプルプロジェクト ListBox_flicker_scroll.zip

WP7 Mango の ListBox には、スクロール中にがたがたスクロールになってしまうという不具合があります。

Windows Phone7 において ListBox は必須のコントロールで、このコントロールを使用しないアプリというのはほぼないと言っても過言ではないかもしれません。

しかしこの ListBox にバグがあります。

  1. ListBox に高さの違う項目を表示する。
  2. 項目のどれかを選択状態にする(色が変わる)

この条件を満たしてスクロールを行うと、がたがたしながらスクロールが行われます。※ 以下の動画の 0:10~0:20 あたり。

見ている感じだと、

  1. 項目がの高さが高いほど、がたがたがひどい。
  2. 選択した項目から遠ければ遠いほど、がたがたがひどくなる
    と言う特徴があります。

回避方法

回避方法は簡単です。
ListBox が選択状態になっているとがたがたが発生します。ということで listbox.SelectedIndex = -1; とすることでがたがたは回避することが出来ます。しかしこの方法では SelectedIndex を初期化してしまうという副作用があります。

一番副作用の少ない方法は、ListBox からフォーカスを外してしまう という方法です。コードビハインドに以下のコードを追加すれば、がたがたスクロールは無くなります。

※このコードでは this == phoneApplicationPage にフォーカスを移動することで、ListBox からフォーカスを外しています。

private void ListBox_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    this.Focus();
}