2012-02-09 4 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

이 하나가 작동 ...

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; 
} 
관련 문제