Блокировать пузырек мыши в Xamarin Mac

Я создал пользовательский NSView, который я хотел бы разместить поверх содержимого окна, чтобы заблокировать любое взаимодействие, пока загружается весь контент. Проблема, с которой я столкнулся, заключалась в том, что я мог щелкнуть NSView к элементам управления ниже, хотя это было исправлено. Новая проблема заключается в том, что, хотя я не могу щелкнуть элементы управления, когда я перемещаю мышь по элементам управления текстом, мышь переключается на значок I Beam.

Как заставить NSView полностью блокировать все взаимодействия со всем, что находится под ним?

Созданный мной NSView приведен ниже:

[Register("StupidView")]
public class StupidView : NSView
{


    public StupidView()
    {
        // Init
        Initialize();
    }

    public StupidView(IntPtr handle) : base (handle)
    {
        // Init
        Initialize();
    }

    [Export("initWithFrame:")]
    public StupidView(CGRect frameRect) : base(frameRect) {
        // Init
        Initialize();
    }

    private void Initialize()
    {
        this.AcceptsTouchEvents = true;
        this.WantsLayer = true;
        this.LayerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay;
    }

    public override void DrawRect(CGRect dirtyRect)
    {
        var ctx = NSGraphicsContext.CurrentContext.GraphicsPort;
        ctx.SetFillColor(new CGColor(128, 128, 128, 0.7f));
        ctx.FillRect(dirtyRect);
    }

    public override void MouseDown(NSEvent theEvent)
    {
        if (Hidden)
        {
            base.MouseDown(theEvent);
        }
    }

    public override void MouseDragged(NSEvent theEvent)
    {

        if (Hidden)
        {
            base.MouseDragged(theEvent);
        }
    }

    public override bool AcceptsFirstResponder()
    {
        return !this.Hidden;
    }

    public override bool AcceptsFirstMouse(NSEvent theEvent)
    {
        return !this.Hidden;
    }

    public override NSView HitTest(CGPoint aPoint)
    {
        return Hidden ? null : this;
    }
}

person bizzehdee    schedule 27.02.2017    source источник


Ответы (1)


У меня была такая же проблема несколько недель назад, и вот как я мог с этим справиться:

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

 private void Initialize()
 {
    this.AcceptsTouchEvents = true;
    this.WantsLayer = true;
    this.LayerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay;

    //Add button to prevent user interactions 

    NSButton buttonToPreventUserInteraction = new NSButton();
    buttonToPreventUserInteraction.Bordered = false;
    buttonToPreventUserInteraction.Transparent = true;
    buttonToPreventUserInteraction.TranslatesAutoresizingMaskIntoConstraints = false;
    AddSubview(buttonToPreventUserInteraction);

    //If you want to add some constraints on the button, for it to resize and keep the same size of your subview

    var dicoViews = new NSMutableDictionary();
    dicoViews.Add((NSString)"buttonToPreventUserInteraction", buttonToPreventUserInteraction);
    NSLayoutConstraint[] buttonToPreventUserInteractionHorizontalConstraints = NSLayoutConstraint.FromVisualFormat("H:|[buttonToPreventUserInteraction]|", NSLayoutFormatOptions.DirectionLeadingToTrailing, null, dicoViews);
    NSLayoutConstraint[] buttonToPreventUserInteractionVerticalConstraints = NSLayoutConstraint.FromVisualFormat("V:|[buttonToPreventUserInteraction]|", NSLayoutFormatOptions.DirectionLeadingToTrailing, null, dicoViews);
    AddConstraints(buttonToPreventUserInteractionHorizontalConstraints);
    AddConstraints(buttonToPreventUserInteractionVerticalConstraints);

 }

Для другой вашей проблемы, которая заключается в том, что курсор мыши изменяется от содержимого в вашем супервизоре, размещенном ниже, вы можете добавить NSTrackingArea в свой подвид и реализовать метод переопределения «MouseMoved» для изменения курсора. Вы можете сделать что-то вроде этого:

Сначала добавьте NSTrackingArea в свое подпредставление (вы можете поместить этот код в свой метод «Инициализировать»)

NSTrackingAreaOptions opts = ((NSTrackingAreaOptions.MouseMoved | NSTrackingAreaOptions.ActiveInKeyWindow | NSTrackingAreaOptions.InVisibleRect));
var trackingArea = new NSTrackingArea(new CGRect(0, 0, FittingSize.Width, FittingSize.Height), opts, Self, null);

AddTrackingArea(trackingArea);

И затем реализуйте метод переопределения:

public override void MouseMoved(NSEvent theEvent)
{
    //You can choose the type of cursor you want to use here
    NSCursor.ArrowCursor.Set();
}

Это сделало это для меня, надеюсь, что это будет и для вас

person Hikaiix    schedule 28.02.2017
comment
Зона отслеживания решила проблему с I-Beam, спасибо - person bizzehdee; 28.02.2017