在Xamarin Mac中阻止鼠标泡泡

时间:2017-02-27 09:47:32

标签: c# cocoa xamarin 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;
    }
}

1 个答案:

答案 0 :(得分:2)

几个星期前我遇到了同样的问题,这就是我如何管理这个问题:

首先,为了防止用户在下面的超级视图上进行交互,我添加了一个透明按钮,只有抓住鼠标点击,如果你不需要做任何事情,不做任何事情:

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

 }

对于您的其他问题,即鼠标光标从下面的superview中的内容更改,您可以在子视图上添加NSTrackingArea,并实现覆盖方法“MouseMoved”以更改光标。你可以这样做:

首先在您的子视图中添加NSTrackingArea(您可以将此代码放入“Initialize”方法中)

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

这对我来说,希望它也适合你