通过鼠标或触摸关闭 Popup 会导致点击事件

Dismissing Popup by mouse or touch can cause a click event

我在视图模型中有多个按钮 运行ning 命令的视图。

当我在顶部显示设置弹出窗口,然后通过触摸外部将其关闭时,触摸事件还会在我的触摸点下方的按钮上引发点击事件。我不希望点击该按钮。当弹出窗口打开时,一些按钮仍然可见。

我使用 StaysOpen=True 并自行管理弹出窗口关闭,因为出于某种原因,当我触摸外部时弹出窗口不会自行关闭(鼠标正常)。关闭弹出窗口的代码如下:-

private void Grid_PreviewTouchDown(object sender, TouchEventArgs e)
{
    var tp = e.GetTouchPoint(optionsPopupChild).Position;
    if (optionsPopup.IsOpen && !((tp.X >= 0 && tp.X < optionsPopupChild.ActualWidth) && (tp.Y >= 0 && tp.Y < optionsPopupChild.ActualHeight)))
    {
        optionsPopup.IsOpen = false;
        e.Handled = true;
    }
}   

我也曾尝试在 PreviewTouchUp 处理程序中设置 e.Handled = true 类似,但单击事件仍然会传递到导致命令 运行 的按钮。我的印象是设置 e.Handled = true 应该阻止鼠标提升触摸。

感谢帮助。

杰瑞

在主 window 中的所有内容之上放置一个矩形或其他东西。

给它一个低不透明度或透明填充。

(您可能需要将其设置为可聚焦。)

在显示弹出窗口时将其设置为可见。设置它不折叠时。这样当他们尝试点击或触摸他们不应该点击或触摸的东西时,他们做不到。

您是否考虑过如果他们想要 运行 其他应用程序会发生什么情况?

与其在其他地方处理点击和触摸,而只是在您的应用程序中考虑处理 isfocuswithinchanged 在弹出窗口内的父控件上。这样,当他们点击弹出窗口之外的任何内容时,它就会失去焦点,您可以关闭弹出窗口。

你也可以考虑让你的弹出窗口只是你父级 window 中的一个面板,并在其中有一个 "submit" 或 "OK" 按钮来驱动他们完成时应该发生的任何事情它。

所以Andy的建议对我有用,就是在popup后面打开和关闭一个canvas来吞掉流氓点击事件,但是延迟也是需要的!

private async void Grid_PreviewTouchDown(object sender, TouchEventArgs e)
{
    var tp = e.GetTouchPoint(optionsPopupChild).Position;
    if (optionsPopup.IsOpen && !((tp.X >= 0 && tp.X < optionsPopupChild.ActualWidth) && (tp.Y >= 0 && tp.Y < optionsPopupChild.ActualHeight)))
    {
        optionsPopup.IsOpen = false;
        e.Handled = true;
        await TaskDelay(100);
        transCanvas.Visibility = Visibility.Collapsed
    }
}