Как сделать подробное подтверждение с помощью приложения Xamarin Forms ma c? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть приложение Xamarin.Forms для iOS, Android,, и теперь, я надеюсь, Ма c. Я сделал все настройки, чтобы пользовательский интерфейс выглядел великолепно на Ma c. Отправили его на утверждение, где оно было отклонено, поскольку пользователь может закрыть окно, пока приложение и строка меню еще работают. Поэтому я решил добавить всплывающее окно с запросом, хотят ли они выйти из приложения, когда пытаются закрыть окно. ОК = завершить приложение. Отмена = держать окно открытым. Я нахожу много статей о том, как справиться с этим с приложением Xamarin.Mac, но ничего о том, как справиться с Xamarin.Forms на ma c. FormsApplicationDelegate не предоставляет доступ к контроллеру представления или делегату окна для переопределения метода WindowShouldClose. Я обнаружил, что могу использовать NSAlert, чтобы сделать всплывающее окно, которое прекрасно работает. Теперь я не могу найти что-то, что делать, когда пользователь отвечает. Открыт для предложений.

 private void Window_WillClose(object sender, System.EventArgs e)
    {
        NSNotification senderNotification = ((NSNotification)sender); 
        NSWindow closingWindow = (NSWindow)senderNotification.Object;

        var confirmation = new NSAlert()
        {
            AlertStyle = NSAlertStyle.Warning,
            InformativeText = "Are you sure you want to exit the App?",
            MessageText = "Exit?"
        };
        confirmation.AddButton("OK");
        confirmation.AddButton("Cancel");
        var result = confirmation.RunModal();

        if (result == 1001)
        {
            //Cancel closing the window
        }
        else
        {
            //terminate the app
        }

    }

1 Ответ

0 голосов
/ 20 февраля 2020

После долгих экспериментов я нашел решение. Вот что официально прошло обзор Apple. Требуется, чтобы действие меню n было связано как «Новое окно». Он отслеживает открытость windows и, когда остается только один, он предлагает закрыть приложение. Если пользователь закрывает все windows и продолжает работу приложения, у него есть возможность открыть новое окно в меню.

 [Register("AppDelegate")]
    public class AppDelegate : FormsApplicationDelegate
    {
        public NSWindow window;
        private bool closeApp;
        private List<NSWindow> openWindows;
        public override NSWindow MainWindow
        {
            get { return window; }
        }


        public AppDelegate()
        {
            this.closeApp = false;
            this.openWindows = new List<NSWindow>();
            createNewWindow();
        }

        [Action("newWindow:")]
        public void newWindow(NSObject sender)
        {

            createNewWindow();
            this.window.MakeKeyAndOrderFront(sender);
            LoadApplication(new App());
            base.DidFinishLaunching(null);

        }

        private void createNewWindow()
        {
            var style = NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Titled;
            var rect = new CoreGraphics.CGRect(200, 1000, 1024, 768);
            window = new MainWindow(rect, style, NSBackingStore.Buffered, false);
            window.Title = "MyApp"; // choose your own Title here
            window.TitleVisibility = NSWindowTitleVisibility.Hidden;
            window.WillClose += Window_WillClose;
            openWindows.Add(window);
        }

        private void Window_WillClose(object sender, System.EventArgs e)
        {
            openWindows.Remove((NSWindow)((NSNotification)sender).Object);
            if (openWindows.Count == 0)
            {
                var confirmation = new NSAlert()
                {
                    AlertStyle = NSAlertStyle.Warning,
                    InformativeText = "Do you want to exit the app?",
                    MessageText = "Exit?"
                };
                confirmation.AddButton("Yes");
                confirmation.AddButton("No");
                var result = confirmation.RunModal();

                if (result == 1001)
                {
                    this.closeApp = false;
                }
                else
                {
                    //terminate the app
                    this.closeApp = true;
                }
            }
        }

        public override bool ApplicationShouldTerminateAfterLastWindowClosed(NSApplication sender)
        {
            return closeApp;
        }

        public override void DidFinishLaunching(NSNotification notification)
        {
            Forms.Init();
            LoadApplication(new App());
            base.DidFinishLaunching(notification);
        }
    }
...