通过鼠标或触摸关闭 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
}
}
我在视图模型中有多个按钮 运行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
}
}