2012-02-09 15 views
18

右クリックしてコンテキストメニューを表示させて、いくつかの操作を行うことができる項目のリストを作成しようとしています。私はそれを完了しました、全く問題はありません。右クリックしてListBox内の項目を選択してください

しかし、アイテムを右クリックしたときに、現在のアイテムを選択したままにしてマウスが上にあるアイテムを選択するようにしたいと思います。

私はこのやその他の関連する質問を調査しましたが、indexFromPointを使用しようとしましたが(私の研究ではわかりましたが)、アイテムを右クリックするたびに常に選択項目がクリアされ、選択した項目がない場合は表示されないように設定しているので、コンテキストメニューを表示します。

ListBox.SelectedIndex = ListBox.IndexFromPoint(Cursor.Position.X, Cursor.Position.Y); 
+0

このルックスをSystem.Windows.Forms.ListBoxのバグのように、Microsoftに報告する必要があります。 –

答えて

31

ListBox.MouseDownを処理し、そこで項目を選択します。ここでは

は、私が現在使用しているコードです。このように:

private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X, e.Y); 
} 
+4

コンテキストメニューがすでにリストボックスにバインドされている場合は、次のようにします。 private void listBoxItems_MouseDown(Object sender、MouseEventArgs e) { listBoxItems.SelectedIndex = listBoxItems.IndexFromPoint(e.X、e.Y); } –

5

この1つが働いている...

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]; 
     } 
    } 

} 
+0

この行を置き換えただけです。listBox.Items [index]; .SelectedIndex = index;で。これは完全に機能します。 –

+0

clickイベントが右ボタンまたは中央ボタンをキャプチャしていないように見えます。それらをキャプチャするためにMouseUpを使用する必要があります.. – MattClimbs

0

も、その後全体リストボックス上の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; 
}