移动 NSWindow 中的 NSTrackingArea 会导致快速切换
NSTrackingArea in moving NSWindow causes rapid toggle
我正在为 MacOS 应用程序制作 Xamarin.Forms。我在主 NSWindow 中有一个 NSTrackingArea,它会在鼠标进入/退出时触发 window 调整大小。
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);
}
}
问题在于,用户可以快速将鼠标移出 window,导致一系列 window 调整大小,如果鼠标定位正确,则 window 将无限期地来回调整大小。
我试过的
- 切换 NSWindow 的 IgnoresMouseEvents,但它导致的问题多于解决的问题。
- 在 MouseEnter 和 MouseLeave 侦听器被调用后删除和添加侦听器
我猜大多数问题是调整大小是在不同的线程上完成的,这允许调整大小累积。
我通过为 NSWindow class 扩展添加 CanToggle 属性 解决了这个问题。 MouseEnter 和 MouseLeave 检查这个标志;如果 CanToggle 为假,则不执行任何操作。 classes 之外可以在适当的时候设置 CanToggle 属性。
我正在为 MacOS 应用程序制作 Xamarin.Forms。我在主 NSWindow 中有一个 NSTrackingArea,它会在鼠标进入/退出时触发 window 调整大小。
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);
}
}
问题在于,用户可以快速将鼠标移出 window,导致一系列 window 调整大小,如果鼠标定位正确,则 window 将无限期地来回调整大小。
我试过的
- 切换 NSWindow 的 IgnoresMouseEvents,但它导致的问题多于解决的问题。
- 在 MouseEnter 和 MouseLeave 侦听器被调用后删除和添加侦听器
我猜大多数问题是调整大小是在不同的线程上完成的,这允许调整大小累积。
我通过为 NSWindow class 扩展添加 CanToggle 属性 解决了这个问题。 MouseEnter 和 MouseLeave 检查这个标志;如果 CanToggle 为假,则不执行任何操作。 classes 之外可以在适当的时候设置 CanToggle 属性。