WPF鼠标捕获被立即强制释放

3
我正在构建一个包含飞出面板的用户控件。
当我单击按钮打开面板时,我试图捕获鼠标,以便我可以检测用户是否在飞出面板外单击,以便我可以关闭它。
但是,在我捕获鼠标后,我会收到一个失去鼠标捕获事件,并且无法检测面板外的点击。
这里是我检测直接打开关闭点击的位置。
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();
    }
}

}

如果我将代码加入到捕获失去焦点事件中,它会在 flyout 打开后立即触发。当我检查结果变量时,无论我如何捕获鼠标,结果都是 true,因此似乎工作正常。

有什么想法吗?

1个回答

2

首先,在将indicatorVM的可见性设置为Visible后,尝试进行UpdateLayout,然后再捕获鼠标。这样可以避免在捕获鼠标后布局发生变化,从而导致你无法捕获鼠标。我的第二个建议是稍微延迟使用Dispatcher Invoke来捕获鼠标,代码如下:

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

捕获将在布局效果之后发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接