wpf mousecapture立即被释放

时间:2011-07-16 05:29:44

标签: wpf wpf-controls mousecapture

我正在构建一个包含弹出式面板的用户控件。

当我点击按钮打开面板时,我正在尝试捕捉鼠标,以便我可以检测用户是否点击了弹出式面板,以便我可以关闭它。

但是在我捕获鼠标之后,我得到一个丢失的鼠标捕获事件,我无法检测到面板外的点击。

这里是我检测到直接打开关闭点击的地方

private void Grid_MouseUP(object sender, MouseButtonEventArgs e)
{
if (indicatorVM != null)
{
    if (indicatorVM.SettingsFlyoutVisibility == Visibility.Collapsed)
    {
        doRelease = false;
        indicatorVM.SettingsFlyoutVisibility = Visibility.Visible;
        bool result = this.CaptureMouse();
        result = Mouse.Capture(this, CaptureMode.SubTree);
    }
    else
    {
        doRelease = true;
        indicatorVM.SettingsFlyoutVisibility = Visibility.Collapsed;
        this.ReleaseMouseCapture();
    }
}

}

如果我连接到捕获丢失事件,它会在弹出窗口打开后立即命中。当我检查结果变量时,无论我如何捕获鼠标,结果都是真的,因此它似乎正常工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先,在捕获鼠标之前,在将indicatorVM的可见性设置为Visible之后立即尝试UpdateLayout。这将避免在捕获鼠标后更改布局,这可能是从您那里窃取捕获的原因。我的第二个建议是稍微推迟使用Dispatcher Invoke进行捕获,如下所示:

Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate()
{
    bool result = this.CaptureMouse();
    result = Mouse.Capture(this, CaptureMode.SubTree);
 });

然后捕获将在布局后果之后。