Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF列表框拖放;drop会干扰ContextMenu吗?_Wpf_Listbox_Drag And Drop_Contextmenu - Fatal编程技术网

WPF列表框拖放;drop会干扰ContextMenu吗?

WPF列表框拖放;drop会干扰ContextMenu吗?,wpf,listbox,drag-and-drop,contextmenu,Wpf,Listbox,Drag And Drop,Contextmenu,我正在从列表框中实现拖放,但是我在窗口的其他地方看到了ContextMenu的一些奇怪行为。如果打开关联菜单,然后从列表框开始拖动,关联菜单将关闭,但在执行另一次拖动之前不会再次打开 这有意义吗?有人知道会发生什么吗 <ListBox Grid.Row="0" ItemsSource="{Binding SourceItems}" MultiSelectListboxDragDrop:ListBoxExtension.SelectedItemsSource="{Binding Select

我正在从列表框中实现拖放,但是我在窗口的其他地方看到了ContextMenu的一些奇怪行为。如果打开关联菜单,然后从列表框开始拖动,关联菜单将关闭,但在执行另一次拖动之前不会再次打开

这有意义吗?有人知道会发生什么吗

<ListBox Grid.Row="0" ItemsSource="{Binding SourceItems}" MultiSelectListboxDragDrop:ListBoxExtension.SelectedItemsSource="{Binding SelectedItems}" SelectionMode="Multiple" PreviewMouseLeftButtonDown="HandleLeftButtonDown" PreviewMouseLeftButtonUp="HandleLeftButtonUp" PreviewMouseMove="HandleMouseMove"/>
<ListBox Grid.Row="1" ItemsSource="{Binding DestinationItems}" AllowDrop="True" Drop="DropOnToDestination" />
<Button Grid.Row="2">
    <Button.ContextMenu>
        <ContextMenu x:Name="theContextMenu">
            <MenuItem Header="context 1"/>
            <MenuItem Header="context 2"/>
            <MenuItem Header="context 3"/>
        </ContextMenu>
    </Button.ContextMenu>
    Button with context menu
</Button>

这似乎和抓老鼠有关

拖动过程中正常的事件顺序如下所示

  • PreviewMouseLeftButtonDown
    处理程序被调用并
    ListBox.IsMouseCaptureWithin
    is 错
  • PreviewMouseMove
    处理程序 有人打电话来。这时
    ListBox.IsMouseCaptureWithin
    为true
  • PreviewMouseMove
    处理程序中
    DragDrop.DoDragDrop
    被调用并 在这期间的某个时候,鼠标 捕获将从列表框中释放
  • 但是,当上下文菜单打开时开始拖动的情况似乎是

  • PreviewMouseLeftButtonDown
    处理程序被调用并
    ListBox.IsMouseCaptureWithin
    is 错
  • PreviewMouseMove
    处理程序获取 打电话。但这次
    ListBox.IsMouseCaptureWithin
    is 还是假的
  • 比赛结束后的某个时候
    PreviewMouseMove
    处理程序 ListBox然后获取鼠标捕获 (
    ListBox.IsMouseCaptureWithin
    变为现实)
  • 这样做的结果是,在拖动之后,ListBox仍然具有鼠标捕获功能,因此任何单击按钮打开上下文菜单的操作实际上都会转到ListBox,而不是按钮

    将以下代码添加到
    PreviewMouseLeftButtonDown
    处理程序的开头似乎有帮助,因为它吞下了关闭该上下文菜单的单击,而不是尝试从中开始拖动

    if (!contextMenuCloseComplete)
    {
        sourceElement.CaptureMouse();
        return;
    }
    
    …在上下文菜单的
    Closed
    Opened
    事件的处理程序中设置
    contextMenuCloseComplete
    bool

    这有意义吗?有人知道这种捕捉老鼠的行为是从哪里来的吗

    if (!contextMenuCloseComplete)
    {
        sourceElement.CaptureMouse();
        return;
    }