使用MVVM的MahApps MessageBoxes

Moo*_*ght 19 c# wpf mvvm caliburn.micro mahapps.metro

MahApps Merry Men的简单问题.我已经使用Caliburn.Micro使用你的伟大的地铁风格的控件实现了MVVM的应用程序.新的消息对话框看起来很棒,但目前还没有明确的方法来启动这些对话框而不用编写自己的包装器(我不反对).但是,这已经完成或者是否有我遗漏的东西,以便我可以从视图模型中调用消息框而不用大惊小怪?

谢谢你的时间.

Gui*_*ira 19

我创建了一个包装器来调用MahApps.Metro消息对话框,因为我的MVVM项目遇到了同样的问题.我必须创建一个打开的窗口列表,第一个窗口将始终是我的MainWindow.

这是我的DialogService代码:

public async Task<MessageDialogResult> ShowMessage(string message, MessageDialogStyle dialogStyle)
{
    var metroWindow = (_openedViews.First() as MetroWindow);
    metroWindow.MetroDialogOptions.ColorScheme = MetroDialogColorScheme.Accented;

    return await metroWindow.ShowMessageAsync("MY TITLE", message, dialogStyle, metroWindow.MetroDialogOptions);
}
Run Code Online (Sandbox Code Playgroud)

此代码可用于显示带或不带结果的对话框.您可以注意到它的返回值为a Task<MessageDialogResult>,因此如果您想获得结果,可以在ViewModel上执行此操作:

MessageDialogResult result = await _dialog.ShowMessage("SOME MESSAGE HERE", MessageDialogStyle.AffirmativeAndNegative).ConfigureAwait(false);

if (result == MessageDialogResult.Affirmative)
{
    //Do something
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果调用该方法ShowMessage()的结果,你需要必须async上分配,否则将无法正常工作.(如果您只想显示消息对话框,则没有必要).

我的项目使用的是Framework 4.0,我只能使用async/await由于我必须从NuGet安装的软件包.您可以访问此程序包的MSDN文档的此链接,您可以在此处下载该程序包.

我希望它已经解决了你的问题.

编辑:

我在我的实现了一个方法DialogService来打开任何ViewModel的窗口.这个方法使用Microsoft Unity框架来实例化我的对象,然后我调用它Show()来打开它自己.在通话之前Show(),我在列表中添加此窗口.

看我的代码:

public void ShowView<T>(params ParameterOverride[] parameter)
{
    var window = UnityServiceConfigurator.Instance.Container.Resolve<T>(parameter) as MetroWindow;

    if (window != null)
    {
        if (Application.Current.MainWindow != window)
        {
            window.Owner = Application.Current.MainWindow;
            var ownerMetroWindow = (window.Owner as MetroWindow);

            if (!ownerMetroWindow.IsOverlayVisible())
                ownerMetroWindow.ShowOverlayAsync();
        }

        if (!_openedViews.Contains(window))
            _openedViews.Add(window);

        window.Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我从ViewModel调用的方式:

_dialog.ShowView<MyView>();
Run Code Online (Sandbox Code Playgroud)

如果整个软件上只有一个窗口,则可以保存其引用并使用它来显示,ShowMessageAsync()而无需创建仅使用First的List.像这样:

var metroWindow = (Application.Current.MainWindow as MetroWindow);
Run Code Online (Sandbox Code Playgroud)


Jam*_*ock 19

从1.1.3-ALPHA*(变为1.2.0)开始,MahApps提供了一个帮助程序,可以从VM启动对话框,它可以在多个Window设置中运行:

1)使用窗口中的附加属性向对话子系统注册视图模型.

假设View的DataContext设置为要从中启动对话框的视图模型,请添加以下属性:

<Controls:MetroWindow 
    xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
    Dialog:DialogParticipation.Register="{Binding}">
Run Code Online (Sandbox Code Playgroud)

2)抓取/注入DialogCoordinator:

new MainWindowViewModel(DialogCoordinator.Instance);
Run Code Online (Sandbox Code Playgroud)

3)从视图模型中显示对话框.使用"this"作为上下文,以便MahApps可以将您的视图模型与正确的窗口结合:

_dialogCoordinator.ShowMessageAsync(this, "Message from VM", "MVVM based dialogs!")
Run Code Online (Sandbox Code Playgroud)