在开发SilverLight时,弹窗一直都是用的回调方式,比如需要用户确认才能继续操作的,如果有好几个确认步骤,这时候回调函数就比较深了,代码基本看不懂,可以使用TaskCompletionSource把事件改为异步等待方法,全部改成同步的写法,爽的飞起。
关键代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[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; };
}
这样使用
1
2
3
4
var result = await MsgBoxWindow.ShowAsync("点吧", "店不大", MsgBoxButton.YesNo);
MessageBox.Show(result.ToString());
var result2 = await MsgBoxWindow.ShowAsync("点吧2", "店不大2", MsgBoxButton.YesNo);
MessageBox.Show(result2.ToString());
再也不需要这样了
1
2
3
4
5
6
7
MsgBoxWindow.Show("点吧", "店不大", MsgBoxButton.YesNo, rs => {
MessageBox.Show(rs.ToString());
MsgBoxWindow.Show("点吧2", "店不大2", MsgBoxButton.YesNo, rs2 =>
{
MessageBox.Show(rs2.ToString());
});
});
参考资料
本文会经常更新,请阅读原文: https://dashenxian.github.io/post/SilverLight%E7%B1%BB%E4%BC%BCWinForm%E5%BC%B9%E7%AA%97%E7%AD%89%E5%BE%85%E7%BB%93%E6%9E%9C%E5%86%8D%E7%BB%A7%E7%BB%AD%E6%89%A7%E8%A1%8C ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com) 。