最近、ツールを作るときに、Windows Forms ではなくて、WPF を使っています。
理由の第一は、UI が綺麗に作れるから、なんですが、通常のフォームアプリケーションを作るのと勝手が違う or 動きがおかしい、とろが多々あって、ちょっと避けるべき理由もちらほら。
今、使っているのは WPF のリストボックスなのですが、どうやら、
- リストボックスの項目を Remove メソッドで削除する。
- カーソルを設定するために SelectedIndex で選択させる。
- この後、カーソルキーの上矢印や下矢印キーを押すと、先頭にカーソルが移動してしまう。
という現象です。
削除する場合は、次のコードのように、DELETEキーを押したときに、選択行を削除します。
private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete)
{
int index = listBox1.SelectedIndex;
listBox1.Items.RemoveAt(index);
index–;
if (index < 0) index = 0;
listBox1.SelectedIndex = index;
}
}
こうするとですね、せっかく SelectedIndex を設定していのに、上下の矢印キーで先頭の行にジャンプしてしまうんですよね。。。どうも、SelectedIndex の値が、内部で反映されていない気がします。
# 似たような現象を、Siverlight の ListBox で経験したような覚えがあるんだけど…ちょっと、解決策を思い出せず。
# XAML で保持しているプロパティに反映されていない雰囲気なんですね。
解決したら追記を書きます。
追記 2010/07/08
へっぽこ独自Silverlightフレームワークが、そんな動きをしていたなぁと思い出した。
MVVM が分かっていなくて、コントロール自身をINotifyChangedをしていたフレームワーク。
まさか、そんなことあるまいな>MS
追記 2010/07/08
どうやら、バグっぽい。
全く同じコードをWindows フォームで動かすと正常に動くので、Microsoftさんにフィードバックしました。
http://connect.microsoft.com/VisualStudioJapan/feedback/details/573823/wpf-listbox-selectedindex