ShowAsync voor Flyout uit Callisto

In Tim's Heuer Calisto zit een Flyout control die erg bruikbaar is  voor het bouwen van Windows 8 apps. Het is een soort vervanger van een MessageDialog die minder irritant voor eind gebruikers is. Echter is het gebruik in code nogal anders. neem het MessageDialog, dat zou er zo uitzien:

public async void ShowMesasgeDialog()
        {
            MessageDialog messageDialog = new MessageDialog("A dialog");
            await messageDialog.ShowAsync();
        }

Duidelijk gebruik van het Task Async Pattern en met het await keyword net als synchrone code leesbaar. Het Flyout uit Callisto gebruik ziet er zo uit:

public void OpenFlyout()
        {
            Flyout flyout = new Flyout();
            // set all properties
            flyout.Closed += (s, e) =>
            {
                // event handler when closed
            };
            flyout.IsOpen = true;


        }

Gebruik hier lijkt veel met op het Event asynchroon pattern waarbij een event word afgevuurd als de async actie compleet is. Code word hierdoor iets moeilijker te begrijpen dan met het async/await keyword.  Gelukkig is met een eenvoudige extension method aan de flyout toe te voegen dit EAP om te zetten naar een TAP method.

Neem de volgende extension method:

ublic static class FlyoutExtensions
    {

        public static TaskCompletionSource<object> GetFlyoutExtension_ShowASync(DependencyObject obj)
        {
            return (TaskCompletionSource<object>)obj.GetValue(FlyoutExtension_ShowASyncProperty);
        }

        public static void SetFlyoutExtension_ShowASync(DependencyObject obj, TaskCompletionSource<object> value)
        {
            obj.SetValue(FlyoutExtension_ShowASyncProperty, value);
        }

        // Using a DependencyProperty as the backing store for FlyoutExtension_ShowASync.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty FlyoutExtension_ShowASyncProperty =
            DependencyProperty.RegisterAttached("FlyoutExtension_ShowASync", typeof(TaskCompletionSource<object>), typeof(FlyoutExtensions), new PropertyMetadata(null));


        public static Task ShowAsync(this Flyout flyout)
        {
            TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
            FlyoutExtensions.SetFlyoutExtension_ShowASync(flyout, tcs);
            flyout.Closed += flyout_Closed;
            flyout.IsOpen = true;
            return tcs.Task;
        }

        private static void flyout_Closed(object sender, object e)
        {
            Flyout flyout = (Flyout)sender;
            TaskCompletionSource<object> tcs = FlyoutExtensions.GetFlyoutExtension_ShowASync(flyout);
            flyout.Closed -= flyout_Closed;
            tcs.TrySetResult(null);
        }
    }
 

en kan nu gebruikt worden met:

public async void OpenFlyout()
        {
            Flyout flyout = new Flyout();
            // settingup the flyout;

            await flyout.ShowAsync();
        }
  •   jeej skype till 22h today..
  •   @VSTS @awscloud @chef @Docker @GooglePlay what are the 10 highest rated widgets?
  •   RT @wpschaub: Over 500 extensions in the VSTS/TFS marketplace https://t.co/pH64ZFRi2J
  •   @mitrik what is difference between code -&gt; files -&gt; history and code -&gt; commits? looks as same? https://t.co/NnA8lk1pTe
  •   @LocalJoost 😵
  •   the moment you need to install ms project....
  •   RT @coolcsh: And we have updated Visual Studio 2017 w/15.3 to for .NET Core 2, https://t.co/2y7Qj07QrB Core 2, .NET Standard 2: https://t.c…
  •   @JenMsft do you know what changed in the latest version of the mail app? the whats new web page is not beeing updated for long time..
  •   new windows sdk! https://t.co/qOlWLICyIB #uwp #uwpdev
  •   @tfsbuck this way doesnt take in consideration it can be set back to "new" because some blocking issues?