前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SilverLight类似WinForm弹窗等待结果再继续执行

SilverLight类似WinForm弹窗等待结果再继续执行

作者头像
用户6362579
发布2020-07-01 10:01:47
7920
发布2020-07-01 10:01:47
举报
文章被收录于专栏:小神仙小神仙

在开发SilverLight时,弹窗一直都是用的回调方式,比如需要用户确认才能继续操作的,如果有好几个确认步骤,这时候回调函数就比较深了,代码基本看不懂,可以使用TaskCompletionSource把事件改为异步等待方法,全部改成同步的写法,爽的飞起。

关键代码

代码语言:javascript
复制
[Flags]
public enum MsgBoxButton
{
    Ok = 1,
    YesNo = 2,
    OkCancel = 4,
    YesNoCancel = 8,

    //图标
    IconInfo = 16,
    IconWarn = 32,
    IconQuestion = 64,
    IconError = 128,
}

public static Task<System.Windows.MessageBoxResult> ShowAsync(string message, string title, MsgBoxButton buttons)
{
    var taskResult = new TaskCompletionSource<System.Windows.MessageBoxResult>();
    MsgBoxWindow messageBox = new MsgBoxWindow();//这是一个ChildWindow,只是自定义了一些样式和加了一些按钮:Yes、no、OK等,仿照winform
    messageBox.generateButtons(buttons);
    messageBox.Title = string.IsNullOrEmpty(title) ? "系统提示" : title;
    messageBox.Message = message;
    messageBox.MessageTextBlock.Width = twidth;

    messageBox.Closed += (ss, ee) =>
    {
        //异步等待关键代码,只有SetResult后,await才会继续执行
        taskResult.SetResult(messageBox._msgBoxResult);//根据点击按钮转换成了System.Windows.MessageBoxResult枚举结果
    };
    messageBox.Show();
    return taskResult.Task;
}
//创建按钮时在点击按钮事件中设置对应的结果
private void createOkButton()
{
    if (_okButton != null) return;

    _okButton = new Button
    {
        Content = "确定",
        Width = 75,
        Margin = new Thickness(2)
    };
    _okButton.Click += (sender, args) => { this._msgBoxResult = MessageBoxResult.OK; DialogResult = true; };
}

这样使用

代码语言:javascript
复制
var result = await MsgBoxWindow.ShowAsync("点吧", "店不大", MsgBoxButton.YesNo);
MessageBox.Show(result.ToString());
var result2 = await MsgBoxWindow.ShowAsync("点吧2", "店不大2", MsgBoxButton.YesNo);
MessageBox.Show(result2.ToString());

再也不需要这样了

代码语言:javascript
复制
MsgBoxWindow.Show("点吧", "店不大",  MsgBoxButton.YesNo, rs => {
    MessageBox.Show(rs.ToString());
    MsgBoxWindow.Show("点吧2", "店不大2", MsgBoxButton.YesNo, rs2 =>
    {
        MessageBox.Show(rs2.ToString());
    });
});

参考资料

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键代码
  • 这样使用
  • 再也不需要这样了
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档