立即强制释放wpf鼠标夹

立即强制释放wpf鼠标夹,wpf,wpf-controls,mousecapture,Wpf,Wpf Controls,Mousecapture,我正在构建一个包含弹出式面板的用户控件 当我点击按钮打开面板时,我试图捕捉鼠标,这样我就可以检测用户是否点击弹出面板,这样我就可以关闭它 但是在我抓到鼠标后,我得到了一个丢失的mousecapture事件,我无法检测到面板外的点击 这里是我检测到直接打开关闭点击的地方 private void Grid_MouseUP(object sender, MouseButtonEventArgs e) { if (indicatorVM != null) { if (indicatorVM.S

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

当我点击按钮打开面板时,我试图捕捉鼠标,这样我就可以检测用户是否点击弹出面板,这样我就可以关闭它

但是在我抓到鼠标后,我得到了一个丢失的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();
    }
}

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


有什么想法吗?

首先,在捕获鼠标之前,在将indicatorVM的可见性设置为Visible之后立即尝试更新。这将避免在捕获鼠标后更改布局,而这可能正是窃取您捕获的内容。我的第二个建议是使用Dispatcher调用稍微推迟捕获,如下所示:

Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate()
{
    bool result = this.CaptureMouse();
    result = Mouse.Capture(this, CaptureMode.SubTree);
 });
然后在布局结果之后进行捕获