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



我有一个视图,其中有许多按钮在视图模型中运行命令。

当我在顶部显示一个设置弹出菜单,然后通过触摸外部来消除它时,触摸事件也会在我触摸点下的按钮上引起点击事件。我不希望那个按钮点击发生。当弹出窗口打开时,某些按钮仍然可见。

我使用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应该阻止鼠标的触摸。

感谢您的帮助。

Jerry

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

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

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

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

你有没有考虑过如果他们想运行其他应用程序会发生什么?

与其在其他地方和应用程序中处理点击和触摸,不如考虑在弹出窗口中的父控件上处理isfocuswithinchanged。这样,当他们点击弹出窗口之外的任何东西时,它就会失去焦点,你可以忽略弹出窗口。

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

所以Andy的建议对我来说很有效,那就是打开和关闭弹出窗口后面的画布来吞下流氓点击事件,但也需要延迟!

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

最新更新