在UserControl Breaks上添加Click Handler单击On Children

时间:2014-10-29 00:30:02

标签: c# wpf events

我有一个用户控件,我试图让它成为可拖动的。除非单击按钮或文本框,否则整个控件应该是可拖动的。我在usercontrol本身上处理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();
}

1 个答案:

答案 0 :(得分:0)

当您使用CaptureMouse()时会出现问题 - 这会永久捕获窗口上的所有鼠标输入,并使其无法单击窗口中的任何内容。我不知道你是否有所不同,或者如果你检查过,但它不是(只是)按钮是不可点击的 - 它实际上就是窗口上的所有东西都是不可点击的。

你必须在捕获它之后用鼠标做一些事情,然后一旦完成,你必须通过调用Mouse.Capture(null)返回正常控制。对你来说,这可能是你的MouseUp()方法中最好的。

但是,这仍然会导致孩子出现问题。我无法想到你能够在父控件上捕获所有鼠标点击事件以及允许它们到达子控件的任何方式。我想你可以在按钮位置检查鼠标位置,相对于UserControl,然后每次都将click事件路由到Button,但这似乎有点过分。有没有一个原因你不能只用一个比Button更低的ZIndex向UserControl添加一个全尺寸的Grid,只是用它来检测是否在UserControl中进行了点击而不是在Button上?