如何在WPF用户控件中调用MahApps Metro对话框框?

5
当我尝试调用MahApps Metro对话框时,传递值时出现了错误。在调用Dialog Control时,当需要传递参数时,我需要传递Metrowindow参数。但是我需要在用户控件中调用它。下面是我需要调用Dialog control的方法。
public async void ShowMessageDialog(object sender, RoutedEventArgs e)
        {
            // This demo runs on .Net 4.0, but we're using the Microsoft.Bcl.Async package so we have async/await support
            // The package is only used by the demo and not a dependency of the library!
            var mySettings = new MetroDialogSettings()
            {
                AffirmativeButtonText = "Hi",
                NegativeButtonText = "Go away!",
                FirstAuxiliaryButtonText = "Cancel",
               // ColorScheme = MetroDialogOptions.ColorScheme
            };

            MessageDialogResult result = await this.ShowMessageAsync("Hello!", "Welcome to the world of metro!",
                MessageDialogStyle.AffirmativeAndNegativeAndSingleAuxiliary, mySettings);

            if (result != MessageDialogResult.FirstAuxiliary)
                await this.ShowMessageAsync("Result", "You said: " + (result == MessageDialogResult.Affirmative ? mySettings.AffirmativeButtonText : mySettings.NegativeButtonText +
                    Environment.NewLine + Environment.NewLine + "This dialog will follow the Use Accent setting."));
        }

public static Task<MessageDialogResult> ShowMessageAsync(this MetroWindow window, string title, string message, MessageDialogStyle style = MessageDialogStyle.Affirmative, MetroDialogSettings settings = null)
        {
            window.Dispatcher.VerifyAccess();
            return HandleOverlayOnShow(settings, window).ContinueWith(z =>
            {
                return (Task<MessageDialogResult>)window.Dispatcher.Invoke(new Func<Task<MessageDialogResult>>(() =>
                {
                    if (settings == null)
                    {
                        settings = window.MetroDialogOptions;
                    }

                    //create the dialog control
                    var dialog = new MessageDialog(window, settings)
                    {
                        Message = message,
                        Title = title,
                        ButtonStyle = style
                    };

                    SizeChangedEventHandler sizeHandler = SetupAndOpenDialog(window, dialog);
                    dialog.SizeChangedHandler = sizeHandler;

                    return dialog.WaitForLoadAsync().ContinueWith(x =>
                    {
                        if (DialogOpened != null)
                        {
                            window.Dispatcher.BeginInvoke(new Action(() => DialogOpened(window, new DialogStateChangedEventArgs())));
                        }

                        return dialog.WaitForButtonPressAsync().ContinueWith(y =>
                        {
                            //once a button as been clicked, begin removing the dialog.

                            dialog.OnClose();

                            if (DialogClosed != null)
                            {
                                window.Dispatcher.BeginInvoke(new Action(() => DialogClosed(window, new DialogStateChangedEventArgs())));
                            }

                            Task closingTask = (Task)window.Dispatcher.Invoke(new Func<Task>(() => dialog._WaitForCloseAsync()));
                            return closingTask.ContinueWith(a =>
                            {
                                return ((Task)window.Dispatcher.Invoke(new Func<Task>(() =>
                                {
                                    window.SizeChanged -= sizeHandler;

                                    window.RemoveDialog(dialog);

                                    return HandleOverlayOnHide(settings, window);
                                }))).ContinueWith(y3 => y).Unwrap();
                            });
                        }).Unwrap();
                    }).Unwrap().Unwrap();
                }));
            }).Unwrap();
        }

使用命令而不是事件,并传递CommandArgument。 - AnjumSKhan
5个回答

6

ShowMessageAsync是MetroWindow的扩展方法,因此这段代码应该可以正常工作:

var metroWindow = (Application.Current.MainWindow as MetroWindow); 
await metroWindow.ShowMessageAsync(title, message);

0

让我给你一个基于Rajesh答案的真实例子。

 async void LoadData()
        {
            var metroWindow = (Application.Current.MainWindow as MetroWindow);
            var controller = await metroWindow.ShowProgressAsync("Procesando", "Obtener datos de la base de datos", 
                false, new MetroDialogSettings() { AnimateShow = true, ColorScheme = MetroDialogColorScheme.Theme});
            controller.SetIndeterminate();

            await viewModel.LoadData();

            await Dispatcher.BeginInvoke((Action)(async () =>
             {
                 DataGrid1.ItemsSource = viewModel.AModels;

                 await controller.CloseAsync();
             }));
        }

0

这是另一个选项,因为我尝试了Rajesh Akshith的答案,但对我没有用。

在用户控件中,

using MahApps.Metro.Controls.Dialogs;

private IDialogCoordinator dialogCoordinator;
public async Task ShowMessageAsync()
        {
            dialogCoordinator = DialogCoordinator.Instance;
            await dialogCoordinator.ShowMessageAsync(this,"Header","Body");
        }

我是从Mahapps Dialog中得到的参考。我认为这更有用,而且它也可以写在帮助类中,您可以从任何地方调用它。


0

@Rajesh的代码在我的用户控件中出现了空指针异常。尽管我的MainWindow是一个MetroWindow类。然而,下面的代码适用于我的配置;

        #region try show Message
        try
        {

            #region ok, lets show message
            foreach (System.Windows.Window window in System.Windows.Application.Current.Windows)
            {
                if (window.GetType() == typeof(MainWindow))
                {

                    var controller = await (window as MainWindow).ShowProgressAsync("My Title", "My long message content text.",
                    false, new MetroDialogSettings() { AnimateShow = true, ColorScheme = MetroDialogColorScheme.Theme });

                }
            }
            #endregion ok, lets show message

        }
        catch (Exception ex)
        {

            #region error block


            #endregion error block

        }
        #endregion try show Message

0

在我的主窗口中:

public async void ShowMessagesDialog(string title, string message)
    {
        logger.Add("ShowMessagesDialog: " + message);
        var messageDialogSettings = new MetroDialogSettings
        {
            AffirmativeButtonText = "Aceptar",
            OwnerCanCloseWithDialog = false,
            ColorScheme = this.MetroDialogOptions.ColorScheme,
        };
        await this.ShowMessageAsync(title, message, MessageDialogStyle.Affirmative, messageDialogSettings);
    }

在我的用户控件中:

(Application.Current.MainWindow as MainWindow).ShowMessagesDialog("Información", "No ha seleccionado un archivo");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接