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

Я делаю приложение Xamarin.Forms для MacOS. У меня есть NSTrackingArea в основном NSWindow, который вызывает изменение размера окна при входе/выходе мыши.

public class MyWindow : NSWindow {
    public event EventHandler MouseEnter;
    public event EventHandler MouseLeave;

    public override void MouseEntered(NSEvent theEvent)
    {
        base.MouseEntered(theEvent);
        MouseEntered?.Invoke(this, EventArgs.Empty);
    }

    public override void MouseExited(NSEvent theEvent)
    {
        base.MouseExited(theEvent);
        MouseLeave?.Invoke(this, EventArgs.Empty);
    }
}

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

Что я пробовал

  • Переключение IgnoresMouseEvents NSWindow, но это вызывает больше проблем, чем решает.
  • Удаление и добавление прослушивателей MouseEnter и MouseLeave после вызова каждого из них

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


person John VanSickle    schedule 08.02.2018    source источник
comment
как вы изменяете размеры окон? Возможно, добавить механизм IsResising.   -  person svn    schedule 09.02.2018
comment
Существует связь, позволяющая классу Xamarin.Forms вызывать MyWindow SetFrame (не напрямую, а по существу). Я решил это с вашим предложением флага, которое является достаточно простым решением. Спасибо!   -  person John VanSickle    schedule 26.02.2018


Ответы (1)


Я решил эту проблему, добавив свойство CanToggle для расширения класса NSWindow. MouseEnter и MouseLeave проверяют этот флаг; если CanToggle имеет значение false, то ничего не выполняется. Внешние классы могут при необходимости установить свойство CanToggle.

person John VanSickle    schedule 26.02.2018