【问题标题】:Why right click event not worked in WPF?为什么右键单击事件在 WPF 中不起作用?
【发布时间】:2013-08-19 15:05:51
【问题描述】:

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

在构造函数中:

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>

请建议,我应该如何使用右键单击事件才能工作?

【问题讨论】:

  • 在右键单击时删除记录似乎是一个糟糕的设计选择 - 右键单击​​几乎被普遍接受为一种显示上下文菜单的安全方式。
  • 在仔细阅读您的问题后,我撤回了我的近距离投票并删除了评论。

标签: c# wpf listboxitem right-click


【解决方案1】:

您的原始代码似乎是多余且冗长的。 MouseRightButtonDown 不起作用,因为已经有一个事件处理列表框项目选择,而 ListBoxItem 数据上下文只是 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 并将其转换为适当的对象。否则,如果您决定要将多个列表框上的功能转换为 sender 到 ListBox

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

【讨论】:

    【解决方案2】:

    右键删除记录不是一个好的设计,它会导致用户更加混淆功能。不过,如果您想做某事,则可以参加 PreviewMouseRightButtonDown 事件。请看下面的sn-p

    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>
    

    【讨论】:

    • 请查看更新后的答案并尝试对我有用的 XAML
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多