トグル選択に変更したい ListBox コントロールがあります。つまり、項目を 1 回クリックすると選択され、もう一度クリックすると選択が解除されます。また、リスト内の別のアイテムをクリックすると、前のアイテムの選択を解除して新しいアイテムを選択するデフォルトのアクションが実行されます。
これを達成する最善の方法は何ですか?
トグル選択に変更したい ListBox コントロールがあります。つまり、項目を 1 回クリックすると選択され、もう一度クリックすると選択が解除されます。また、リスト内の別のアイテムをクリックすると、前のアイテムの選択を解除して新しいアイテムを選択するデフォルトのアクションが実行されます。
これを達成する最善の方法は何ですか?
必要なのは RadioButtonList です。ItemDataTemplate を作成し、その中に RadioButton を配置することで作成できます。次に、RadioButton のテンプレートをボタンのように変更できます。
ToggleListBoxとToggleListBoxItemの2つのカスタムクラスを少し作成することで、これを自分で達成することができました。いくつかの便利なオーバーライドがあります(ToggleListBoxで最も重要なのは、ListBoxItemを作成するものです)。
そこから、同じアイテムを2回クリックしたり、スペース/エンターキーを押したりするのは簡単でした。両方のクラスに40行のコードがあり、正常に機能します。
誰かが興味を持っている場合に備えて、私はこれに対する別の解決策を見つけました。私はに設定しListBox.SelectionMode
、Multiple
MouseDown イベントを次のように処理しました。
EventManager.RegisterClassHandler(typeof(ListBoxItem),
ListBoxItem.MouseLeftButtonDownEvent,
new RoutedEventHandler(this.HandleListBox_MouseDown));
...
void HandleListBox_MouseDown(object sender, RoutedEventArgs e)
{
var listBoxItem = (ListBoxItem)sender;
if (ShouldDeselectOtherListItems(listBoxItem))
{
listBox.SelectedIndex = -1;
}
}
bool ShouldDeselectOtherListItems(ListBoxItem listBoxItem)
{
return !listBoxItem.IsSelected
&& listBox.SelectedItems.Count > 0;
}
listBox は、親の ListBox コントロールです。システムの MouseDown イベント ハンドラーを処理する前に、すべてのリスト ボックス項目が選択解除されていることを確認し、同じリスト ボックス項目の選択状態を切り替えることができます。
必要なデフォルトの動作を維持するように標準のListBoxを維持します。次に、アイテムの選択を解除するには、マウスダウンイベントでそれを処理できますか? つまり、次のようなものを使用します。
Point newPoint = e.GetPosition(backgroundImage);
HitTestResult result = VisualTreeHelper.HitTest(this, newPoint);
if (result.VisualHit is ListBoxItem)
これが最善の方法かどうかはわかりませんが、これを行う唯一の方法は、標準の Windows コントロールから独自の ListBox を派生させ、依存関係プロパティを追加して、スタイルで選択解除を処理できるようにすることです。このアプローチを採用したい場合は、維持したいデフォルトの動作も削除しないでください。このアプローチを使用して、テキストの横に画像を表示する ListBox を作成しました。
どこから始めるべきかについての指針が必要な場合は、私に声をかけてください。