2013-08-19 2 views
0

마우스 오른쪽 버튼으로 목록 상자 항목을 삭제하고 싶습니다. 그러나 내 사건에서는 제대로 작동하지 않는 이벤트를 오른쪽 클릭하십시오. 아래 코드는 제가 시도한 코드입니다. 생성자에서WPF에서 마우스 오른쪽 버튼 클릭 이벤트가 작동하지 않는 이유는 무엇입니까?

:

listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick); 

마우스 오른쪽 클릭 XAML에서

private void listBox1_MouseRightClick(object sender, MouseButtonEventArgs e) 
    { 
     if (sender is ListBoxItem) 
     { 
      ListBoxItem item = (ListBoxItem)sender; 
      Harvest_TimeSheetEntry entryToDelete = (Harvest_TimeSheetEntry)item.DataContext; 

      MessageBoxResult Result = System.Windows.MessageBox.Show("Are you sure?", "Delete Confirmation", System.Windows.MessageBoxButton.YesNo); 

      if (Result == MessageBoxResult.Yes) 
      { 
       Globals._globalController.harvestManager.deleteHarvestEntry(entryToDelete); 
      } 
      else 
      { 
       System.Windows.MessageBox.Show("Delete operation Terminated"); 
      } 
     } 
    } 

:

<ListBox x:Name="listBox1" ItemsSource="{Binding}" Margin="0,131,0,59" ItemTemplateSelector="{StaticResource templateSelector}" SelectionMode="Single" MouseRightButtonDown="listBox1_MouseRightClick"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <EventSetter Event="MouseDown" Handler="listBox1_MouseRightClick"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

제안하십시오를 작동 할 수 있도록 내가 마우스 오른쪽 버튼으로 클릭 이벤트를 사용하는 방법?

+2

sender 캐스트로 결정한 그렇지 않은 경우 - 마우스 오른쪽 버튼을 클릭 거의 보편적으로 제기 할 수있는 안전한 방법으로 인정되는 상황에 맞는 메뉴. –

+0

나는 가까운 투표를 취소하고 질문을 더 자세히 읽은 후 의견을 삭제했습니다. –

답변

0

을 다음과 같이 XAML을 변경

ListBox1.PreviewMouseRightButtonDown += new MouseButtonEventHandler(ListBox1_MouseRightButtonDown); 

을 니펫을 참조하십시오. MouseRightButtonDown은 이미 목록 상자 항목 선택을 처리하는 이벤트가 있기 때문에 작동하지 않으며 ListBoxItem datacontext는 listBox1의 SelectedItem입니다.

스타일을 무시하고 미리보기 이벤트로 목록 상자를 선언하십시오. 버블 대신에 MouseRightButtonDown을 터널링합니다. 생성자에서

<ListBox x:Name="listBox1" 
     ItemsSource="{Binding}" 
     ItemTemplateSelector="{StaticResource templateSelector}" 
     Margin="0,131,0,59" 
     SelectionMode="Single" 
     PreviewMouseRightButtonDown="listBox1_MouseRightClick" /> 

sender 당신에 ListBox1 인 이벤트 핸들러에서 지금이

listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick); 

제거하지만 다른리스트 박스에이 이벤트를 묶는하지 않는 경우, 단지에서의 selectedItem을 얻을 listbox1을 만들고 적절한 객체로 캐스팅합니다. 당신은 당신이 여러리스트 박스의 기능을 마우스 오른쪽 버튼으로 클릭에 대한 기록이 가난한 디자인 선택처럼 보인다 삭제 ListBox

private void listBox1_MouseRightClick(object sender, MouseButtonEventArgs e) 
{ 
     Harvest_TimeSheetEntry entryToDelete = (Harvest_TimeSheetEntry)listBox1.SelectedItem; 
     if(entryToDelete != null) 
     { 
      //Do work 
     } 
} 
+0

감사합니다. 그거야. – user2622971

0

오른쪽 클릭으로 레코드를 삭제하는 것은 좋은 디자인이 아니며 사용자가 기능을 혼동하게 만듭니다. 그래도 뭔가를하고 싶다면 PreviewMouseRightButtonDown 이벤트로 이동할 수 있습니다. (가) 아래의 원래 코드가 중복 및 자세한 보인다

<ListBox x:Name="listBox1" 
      ItemsSource="{Binding}" 
      Margin="0,131,0,59" 
      ItemTemplateSelector="{StaticResource templateSelector}" 
      SelectionMode="Single"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <EventSetter Event="PreviewMouseRightButtonDown" 
          Handler="ListBox1_PreviewMouseRightButtonDown" /> 
      </Style> 
     </ListBox.ItemContainerStyle> 
</ListBox> 
+0

나는 이것을 시도했다. 그러나 일하지 않았다. – user2622971

+0

업데이트 된 답변을보고 나를 위해 작동하는 XAML을 시도하십시오 –

+0

내 xaml에서 정확히 동일하게 수행했습니다. 하지만 여전히 작동하지 않습니다. – user2622971

관련 문제