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();
        }
  •   @sandeepchads i needed this last week!
  •   @hrist0ph sorry very busy with work at the moment; but working on a rewrite based on the new sdk but not going as fast as i want
  •   @surface thanks but says i am up to date and want all the goodness of 19H1 on my Surface Go
  •   how often i have to press check for updates to force the may update on my surface go 🐱‍👓? #windowsinsiders
  •   @JenMsft Already available to surface go?
  •   RT @windowsblog: Announcing UI Tests in CI/CD for Desktop App Developers https://t.co/3DK2wzAGlX
  •   RT @mrlacey: I get excited about the simplest (obscure?) things sometimes. Yay, XmlnsDefinitionAttribute is coming to .NET Core 3.0, which…
  •   Why does @slack starts faster on my lightweight mobile device then on my heavy powered Core i7 Laptop?
  •   RT @alexmullans: Azure Artifacts is now priced per GB stored 🥳. No more buying and assigning licenses. Start at https://t.co/JAn6daobLV. F…
  •   @LocalJoost i am the creator :) #sorry