示例#1
0
        public override Task <DialogResult> ShowDialogAsync(
            object content, string caption,
            DialogButton dialogButton,
            DialogImage dialogImage           = DialogImage.None,
            DialogController dialogController = null)
        {
            Window     mainWindow = GetActiveWindow();
            Dispatcher dispatcher = mainWindow != null
                                                                                ? mainWindow.Dispatcher
                                                                                : Dispatcher.CurrentDispatcher;

            string bodyString    = content?.ToString().Parse() ?? string.Empty;
            string captionString = caption?.Parse() ?? string.Empty;

            if (dispatcher == null || dispatcher.CheckAccess())
            {
                MessageBoxResult messageBoxResult;

                try
                {
                    Interlocked.Increment(ref openDialogCount);

                    if (mainWindow != null)
                    {
                        /* We are on the UI thread, and hence no need to invoke the call.*/
                        messageBoxResult = MessageBox.Show(
                            mainWindow,
                            bodyString,
                            captionString,
                            dialogButton.TranslateToMessageBoxButton(),
                            dialogImage.TranslateToMessageBoxButton());
                    }
                    else
                    {
                        messageBoxResult = MessageBox.Show(
                            bodyString,
                            captionString,
                            dialogButton.TranslateToMessageBoxButton(),
                            dialogImage.TranslateToMessageBoxButton());
                    }
                }
                finally
                {
                    Interlocked.Decrement(ref openDialogCount);
                }

                return(Task.FromResult(
                           messageBoxResult.TranslateToMessageBoxResult()));
            }

            DialogResult result = DialogResult.OK;             /* Satisfy compiler with default value. */

            dispatcher.Invoke((ThreadStart) delegate
            {
                MessageBoxResult messageBoxResult;

                try
                {
                    Interlocked.Increment(ref openDialogCount);

                    if (mainWindow != null)
                    {
                        /* We are on the UI thread,
                         * and hence no need to invoke the call.*/
                        messageBoxResult = MessageBox.Show(mainWindow, bodyString, captionString,
                                                           dialogButton.TranslateToMessageBoxButton(),
                                                           dialogImage.TranslateToMessageBoxButton());
                    }
                    else
                    {
                        messageBoxResult = MessageBox.Show(bodyString, captionString,
                                                           dialogButton.TranslateToMessageBoxButton(),
                                                           dialogImage.TranslateToMessageBoxButton());
                    }
                }
                finally
                {
                    Interlocked.Decrement(ref openDialogCount);
                }

                result = messageBoxResult.TranslateToMessageBoxResult();
            });

            return(Task.FromResult(result));
        }