通过鼠标或触摸消除弹出窗口可能会导致单击事件

时间:2019-09-04 08:26:06

标签: wpf popup touch

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

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

我使用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;
    }
}   

我也尝试过类似地在e.Handled = true处理程序中设置PreviewTouchUp,但是click事件仍然通过按钮传递,导致Command运行。我的印象是设置e.Handled = true应该阻止鼠标推动触摸。

帮助表示赞赏。

杰里

2 个答案:

答案 0 :(得分:1)

在主窗口的所有内容上方放置一个矩形或其他内容。

赋予它低透明度或透明填充。

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

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

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

与其处理其他地方的单击和触摸,还不如只是在您的应用中,请考虑在弹出窗口中的父控件上更改isfocuswithchange。这样,当他们单击该弹出窗口之外的任何内容时,它将失去焦点,因此您可以关闭弹出窗口。

您还可以考虑使弹出窗口只是父窗口内的一个面板,并在其中具有“提交”或“确定”按钮,以驱动完成后应该发生的一切。

答案 1 :(得分:0)

因此,安迪的建议对我有用,那就是打开和关闭弹出窗口后面的画布以吞没恶意点击事件,但是也需要延迟!

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