如何实现IDialogService

时间:2016-09-03 08:42:44

标签: wpf async-await mvvm-light

我正在努力实现GalaSoft.MvvmLight程序集中定义的IDialogService。您可以从nuget包MvvmLightLibs

获取
public interface IDialogService
{

    Task ShowError(string message, string title, string buttonText, Action afterHideCallback);
    Task ShowError(Exception error, string title, string buttonText, Action afterHideCallback);
    Task ShowMessage(string message, string title);
    Task ShowMessage(string message, string title, string buttonText, Action afterHideCallback);
    Task<bool> ShowMessage(string message, string title, string buttonConfirmText, string buttonCancelText, Action<bool> afterHideCallback);
    Task ShowMessageBox(string message, string title);
} 

我正在尝试实现第一种方法

    public Task ShowError(Exception error, string title, string buttonText, Action afterHideCallback)
    {
        //var result = MessageBox.Show("");
        return Dispatcher.Invoke(() => MessageBox.Show("whatever"));
        //return Dispatcher.BeginInvoke(delegate () { MessageBox.Show("your stuff"); });
        //var dg = new Action(() => { MessageBox.Show("", ""); });
        //return Dispatcher.CurrentDispatcher.BeginInvoke(dg);
    }    

我如何使用Messagebox.Show这个异步方法为wpf?请帮忙。

我试图看看哪些有效,但到目前为止还没有运气。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

你说你希望你的showError是异步的,但实际上没有使用async关键字标记方法,也没有等待任何东西:

    public async Task ShowError(Exception error, string title, string buttonText, Action afterHideCallback)
    {
        await Dispatcher.InvokeAsync(() => MessageBox.Show("whatever"));
        Console.WriteLine("awaited Box closed");
    }

使用示例:

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        await ShowError(new Exception("Test"), "test", "um", null);
        Console.WriteLine("awaited showError");
    }