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 @AzureDevOps it's not there anymore; the morning i had the feature had a banner in the top of the page that had a button "try"
  •   @sandeepchads @AzureDevOps I had the feature yesterday morning on my environment and in the evening it was gone again 😭
  •   @markscholman @windowsdev Thanks! Jij ook!
  •   Another year @windowsdev MVP #MVPBuzz https://t.co/blu1TMBO0E
  •   RT @kevintgallo: Check it out https://t.co/F9exR1pQMx
  •   RT @stanzillaz: The new Windows Terminal is now on the Store https://t.co/n8rjsg19dv #WindowsInsiders
  •   @tfsbuck maybe not that clear as i was using my phone. in the release note notification I still see the annoucement… https://t.co/tx8DDm36q8
  •   @hermitdave @JenMsft Notifications In your phone, feature in that app
  •   @hermitdave @JenMsft same for apps, surface book has notifications while surface go hasn't for example
  •   @tfsbuck Rollout sprint 152 complete? in notification I still see thee notice of the build content, while other org… https://t.co/SujHBEYP5v