右クリックしてコンテキストメニューを表示することで、いくつかのアクションを実行できる項目のリストを作成しようとしています。私はそれを完了しました、まったく問題ありません。
ただし、現在のアイテムを選択したままにするのではなく、アイテムを右クリックすると、マウスが置かれているアイテムを選択できるようにしたいと考えています。
私はこれと他の関連する質問を調査し、indexFromPoint(私の調査で見つけた)を使おうとしましたが、アイテムを右クリックすると、常に選択されたアイテムが常にクリアされ、コンテキストメニューが表示されません選択したアイテムがない場合は表示されないように設定しています。
これが私が現在使用しているコードです:
ListBox.SelectedIndex = ListBox.IndexFromPoint(Cursor.Position.X, Cursor.Position.Y);
扱う ListBox.MouseDown
でアイテムを選択します。このような:
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X, e.Y);
}
これは動作しています...
this.ListBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.List_RightClick);
private void List_RightClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int index = this.listBox.IndexFromPoint(e.Location);
if (index != ListBox.NoMatches)
{
listBox.Items[index];
}
}
}
リストボックス全体にMouseRightButtonUpイベントを設定すると、同じ動作を得ることができます。
private void AccountItemsT33_OnMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
// If have selected an item via left click, then do a right click, need to disable that initial selection
AccountItemsT33.SelectedIndex = -1;
VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), (sender as ListBox)).OfType<ListBoxItem>().First().IsSelected = true;
}