添加单击处理程序用户控制中断单击子项
本文关键字:单击 中断 控制 用户 处理 程序 添加 | 更新日期: 2023-09-27 18:28:07
我有一个用户控件,我正试图使其可拖动。除了单击按钮或文本框之外,整个控件应该是可拖动的。我正在处理用户控件本身上的mousedown、mouseup和mousemove事件,我可以通过单击任意位置进行拖动。唯一的问题是现在我不能点击用户控件上的任何按钮。知道发生了什么事吗?
代码是这样的:
<UserControl PreviewMouseLeftButtonDown="Popup_PreviewMouseLeftButtonDown" ....STUFF...>
<!-- CAN'T CLICK THIS -->
<Button />
<UserControl>
代码背后:
public void Popup_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e)
{
mouseDown = true;
oldMousePosition = this.PointToScreen(e.GetPosition(this));
this.Popup.Child.CaptureMouse();
}
使用CaptureMouse()时会出现问题-这会永久捕获窗口上的所有鼠标输入,并使其无法单击窗口中的任何内容。我不知道这对你来说是否不同,或者你是否检查过了,但这并不是(只是)按钮是不可点击的——而是实际上窗口上的所有东西都是不可浏览的。
在捕获鼠标后,你必须对它进行实际操作,然后一旦完成,你必须通过调用mouse.Capture(null)来返回正常控制。对你来说,这可能是最好在MouseUp()方法中完成的。
然而,这仍然留下了儿童问题。我真的想不出有什么方法可以同时捕获父控件上的所有鼠标点击事件,并允许它们访问子控件。我想你可以对照按钮的位置来检查鼠标的位置,两者都是相对于UserControl的,然后每次都将点击事件路由到按钮,但这似乎有点太费力了。有什么原因不能用比按钮更低的ZIndex将全尺寸网格添加到UserControl中,并用它来检测是否在UserControl内部而不是在按钮上进行了单击?