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();
        }
  •   RT @windowsblog: Windows Template Studio 1.1 released! https://t.co/qCLpESAvnB
  •   @JenMsft and does sqrt(4) - 2 gives now the right awnser?
  •   @Alex_A_Simons any updates on that what more is happening ? (2/2)
  •   @Alex_A_Simons long time ago you said the mess between msa and aad's would be fixed; first step was block to create msa on aad account. (1/2
  •   First pullrequest for https://t.co/5lEHH630Io :)
  •   @qmatteoq whosdown is great alternative for whatapps and comes from the store
  •   @jvintzel only for windows 10 s users or can other surface users get it too?
  •   RT @JenMsft: O hi there @Spotify 😊 #Windows10 https://t.co/nlJUgM7vVG https://t.co/boah802WgZ
  •   RT @tvgrimbergen: Awesome! Just extended our @MicrosoftTeams bot. Provide natural language input to initiate a leave request powered by @Ni…
  •   @lancewmccarthy kind of sad :/