我在视图模型中有许多运行命令的按钮。
当我在顶部显示设置弹出窗口,然后通过触摸外部将其关闭时,触摸事件还会在我的触摸点下方的按钮上引起单击事件。我不希望该按钮单击发生。弹出窗口打开时,某些按钮仍然可见。
我使用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
应该阻止鼠标推动触摸。
帮助表示赞赏。
杰里
答案 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
}
}