WPF C#XAML ListBox鼠标事件(右键单击vs左键单击)

时间:2018-03-29 09:13:29

标签: c# wpf events listbox click

我动态生成ListBox

在此ListBox中,用户可以通过左键单击选择一个或多个项目。

右键单击ListBox区域的项目,他可以显示上下文菜单。

我的问题是,如果用户右键单击ListBox区域,则所有内容都正确,但如果他右键单击一个项目,则切换选择。

我想通过右键单击来避免项目切换。

这就是我在ListBox中配置MyWindow.cs的方式:

MyBeautifulList.SelectionMode = SelectionMode.Extended;

这是相对XAML文件的一部分:

<ListBox.ContextMenu>
    <ContextMenu>
        <MenuItem Header="Send file"  Click="SendFileToUser" />
        <MenuItem Header="Send folder" Click="SendFolderToUser" />
        <MenuItem Header="Copy user ID to the clipboard" Click="copyUserIDtoClipboard" />
    </ContextMenu>
 </ListBox.ContextMenu>

1 个答案:

答案 0 :(得分:0)

除了点击之外,wpf还提供了许多其他选项。 由于您可能想要阅读的冒泡和隧道路由事件。 您可以处理事件的预览版本,将其标记为已处理,然后停止触发。

class MarriedEditingSupport extends EditingSupport
{
  private final CheckboxCellEditor _editor;

  MarriedEditingSupport(TableViewer viewer)
  {
    super(viewer);

    _editor = new CheckboxCellEditor(viewer.getTable());
  }

  @Override
  protected CellEditor getCellEditor(Object element)
  {
    return _editor;
  }

  @Override
  protected boolean canEdit(Object element)
  {
    return true;
  }

  @Override
  protected Object getValue(Object element)
  {
    return Boolean.valueOf(((Person)element).isMarried());
  }

  @Override
  protected void setValue(Object element, Object value)
  {
    ((Person)element).setMarried(((Boolean)value).booleanValue());

    getViewer().update(element, null);
  }
}

您将不会出现上下文菜单,因此您需要使用代码显示上下文菜单。 命名您的上下文菜单

void MenuItem_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e)
{
  e.Handled = true;
}

然后,您可以在新处理程序的代码中设置IsOpen,例如:

<ContextMenu Name="SomeMeaningfulName">