为什么右键单击事件在WPF中不起作用?

时间:2013-08-19 15:05:51

标签: c# wpf listboxitem right-click

我想在右键单击时删除我的列表框项目。但是,右键单击事件在我的情况下不起作用。 下面是我试过的代码。

在构造函数中:

listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick);

右键点击:

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");
            }
        }
    }

在xaml:

<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 个答案:

答案 0 :(得分:0)

删除右键单击的记录不是一个好设计,它会导致用户更加混淆功能。如果你想做某事,你可以去 PreviewMouseRightButtonDown 事件。请参阅以下代码段

ListBox1.PreviewMouseRightButtonDown += new MouseButtonEventHandler(ListBox1_MouseRightButtonDown);

按如下方式更改您的XAML

<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>

答案 1 :(得分:0)

您的原始代码似乎多余且冗长。 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" />

在构造函数中,摆脱这个

listBox1.MouseDown += new MouseButtonEventHandler(listBox1_MouseRightClick);

现在在事件处理程序中,sender是您的listbox1但如果您不将此事件与其他列表框绑定,只需从listbox1获取selectedItem并将其强制转换为相应的对象。否则,如果您决定要将多个列表框中的功能强制转换为senderListBox

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