wpf mousecapture немедленно освобождается силой - PullRequest
3 голосов
/ 16 июля 2011

Я создаю пользовательский элемент управления, который включает всплывающую панель.

Когда я нажимаю кнопку, чтобы открыть панель, я пытаюсь захватить мышь, чтобы я мог определить, щелкает ли пользователь свсплывающую панель, чтобы я мог ее закрыть.

Но сразу после захвата мыши я получаю событие потерянного захвата мыши и не могу обнаружить щелчки за пределами панели.

здесьЯ обнаруживаю прямое открытое закрытие щелчком

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();
    }
}

}

Если я подключусь к событию потерянного захвата, он срабатывает сразу после открытия выпадающего меню.Когда я проверяю переменную результата, независимо от способа захвата мыши, результат равен true, поэтому, похоже, он работает правильно.

Есть идеи?

1 Ответ

1 голос
/ 29 июля 2011

Во-первых, попробуйте UpdateLayout сразу после установки видимости индикатораVM в Visible, прежде чем захватывать мышь. Это позволит избежать изменения макета после захвата мыши, что, вероятно, и является тем, что крадет захват у вас. Мое второе предложение - немного отложить захват с помощью Dispatcher Invoke, например:

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

Захват будет после последствий макета.

...