WinRT XAML Toolkit: 体验有趣的AsyncUI
在WinRT XAML Toolkit中发现另一个CodePlex中的框架AsyncUI。感觉很有意思,使用它可以用C# 5.0的async/await特性来等待界面上的事件。
比如这样,界面上有一个Button的Name是btn,然后在Page的Loaded事件中可以这样写。
//+ using WinRTXamlToolkit.AsyncUI;
//Main_Loaded_1为Page的Loaded事件
//主界面上有一个Name为btn的Button
private async void Main_Loaded_1(object sender, RoutedEventArgs e)
{
//通过ButtonExtensions.WaitForClickAsync方法来返回一个Task<RoutedEventArgs>
var args = await btn.WaitForClickAsync();
//Click执行后异步等待代码
Show("按钮被点击:" + args.OriginalSource);
}
//显示MessageDialog
static async void Show(string s)
{
await new MessageDialog(s).ShowAsync();
}
代码使用AsyncUI中ButtonExtensions.WaitForClickAsync方法,通过await异步等待返回的Task<RoutedEventArgs>对象,这样实现异步等待Button的Click事件。当Button被点击后,相应事件会执行!如下图:

原理则是利用AsyncUI中的EventAsync.FromRoutedEvent方法,这个方法会返回另一个类型RoutedEventHandlerTaskSource的Task属性。这个类型会使用EventAsync.FromRoutedEvent的参数来对目标事件进行显示注册和取消注册操作。如下ButtonExtensions.WaitForClickAsync的方法源代码:
public static async Task<RoutedEventArgs> WaitForClickAsync(this ButtonBase button)
{
return await EventAsync.FromRoutedEvent(
eh => button.Click += eh,
eh => button.Click -= eh);
}
最后RoutedEventHandlerTaskSource使用.NET中的TaskCompletionSource将对应UI事件的结果设置给TaskCompletionSource,并返回RoutedEventArgs作为Task的返回结果。当Task运行完毕后,EventAsync.FromRoutedEvent方法中的取消注册事件的代码会被运行。
TAG: