【问题标题】:Dismissing Popup by mouse or touch can cause a click event通过鼠标或触摸关闭弹出窗口可能会导致单击事件
【发布时间】:2019-09-04 08:26:06
【问题描述】:

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

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

我使用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 应该防止鼠标提升触摸。

帮助表示赞赏。

杰瑞

【问题讨论】:

    标签: wpf popup touch


    【解决方案1】:

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

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

    (您可能必须将其设置为可聚焦。)

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

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

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

    您还可以考虑将弹出窗口设置为父窗口内的一个面板,并在其中包含一个“提交”或“确定”按钮来驱动完成后应该发生的任何事情。

    【讨论】:

    • 谢谢,我已经尝试过您描述的画布或面板方法,但没有帮助,但我重新审视了它,并在折叠画布之前添加了异步延迟,这似乎解决了问题.
    【解决方案2】:

    所以安迪的建议对我有用,就是在弹出窗口后面打开和关闭一个画布以吞下流氓点击事件,但也需要延迟!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2019-09-07
      相关资源
      最近更新 更多