2012年9月11日星期二

WinRT XAML Toolkit: 体验有趣的AsyncUI

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被点击后,相应事件会执行!如下图:

image

 

 

原理则是利用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: