Не удается запустить MouseEntered на NSButton в Xamarin.Mac - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь программно добавить событие MouseEntered в настраиваемый класс NSButton, и мне не удается заставить его сработать. Я пишу приложение ОС Ma c в Visual Studio для Ma c, используя Xamarin.Ma c. Мне нужно добавить событие в код, потому что я создаю кнопки динамически.

Вот мой ViewController, в котором создаются эти кнопки. Они создаются в методе DrawHexMap внизу.

public partial class MapController : NSViewController
{
    public MapController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        DrawHexMap();
    }

    partial void GoToHex(Foundation.NSObject sender)
    {
        string[] coordinateStrings = ((NSButton)sender).Title.Split(',');

        Hex chosenHex = HexRepo.GetHex(coordinateStrings[0], coordinateStrings[1]);
        HexService.currentHex = chosenHex;

        NSTabViewController tp = (NSTabViewController)ParentViewController;
        tp.TabView.SelectAt(1);
    }

    private void DrawHexMap()
    {
        double height = 60;

        for (int x = 0; x < 17; x++) {

            for (int y = 0; y < 13; y++) {
                HexButton button = new HexButton(x, y, height);

                var handle = ObjCRuntime.Selector.GetHandle("GoToHex:");
                button.Action = ObjCRuntime.Selector.FromHandle(handle);
                button.Target = this;

                View.AddSubview(button);
            }
        }

    }
}

А вот и настраиваемый класс кнопок.

public class HexButton : NSButton
{
    public NSTrackingArea _trackingArea;

    public HexButton(int x, int y, double height)
    {
        double width = height/Math.Sqrt(3);
        double doubleWidth = width * 2;
        double halfHeight = height/2;
        double columnNudge = decimal.Remainder(x, 2) == 0 ? 0 : halfHeight;

        Title = x + "," + y;
        //Bordered = false;
        //ShowsBorderOnlyWhileMouseInside = true;

        SetFrameSize(new CGSize(width, height));
        SetFrameOrigin(new CGPoint(width + (x * doubleWidth), (y * height) + columnNudge));

        _trackingArea = new NSTrackingArea(Frame, NSTrackingAreaOptions.ActiveInKeyWindow | NSTrackingAreaOptions.MouseEnteredAndExited, this, null);
        AddTrackingArea(_trackingArea);
    }

    public override void MouseEntered(NSEvent theEvent)
    {
        base.MouseEntered(theEvent);

        Console.WriteLine("mouse enter");
    }
}

Итак, как видите, я создаю область отслеживания для кнопки и добавив ее в конструктор. Тем не менее, я не могу заставить MouseEntered стрелять. Я знаю, что переопределение MouseEntered в этом классе работает, потому что, когда я вызываю button.MouseEntered () непосредственно из моего кода, метод срабатывает.

Я пробовал еще несколько вещей: Action и Target в ViewController, если они каким-то образом переопределяли обработчик MouseEntered. Установка этих значений внутри конструктора HexButton так, чтобы Target была кнопкой, а не ViewController. Помещение переопределения MouseEntered в ViewController вместо класса кнопки. Создание области отслеживания после того, как кнопка была добавлена ​​в качестве подпредставления к ViewController. Ничего из этого не имело значения.

Любая помощь будет принята с благодарностью! Документацию для Xamarin.Ma найти довольно сложно c ...

Спасибо!

1 Ответ

1 голос
/ 07 мая 2020

Вы добавляете Frame в качестве отслеживаемой области, но вы присоединяете область отслеживания к представлению, из которого вы создаете регион, поэтому вам необходимо отслеживать Bounds координаты.

_trackingArea = new NSTrackingArea(Bounds, NSTrackingAreaOptions.ActiveInKeyWindow | NSTrackingAreaOptions.MouseEnteredAndExited, this, null);

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

...