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();
        }
  •   @JenMsft @LocalJoost @vinothrajendran not sure if related but when i click update &amp; restart my machine restarts, bu… https://t.co/4muU3d7aGG
  •   RT @natfriedman: Today(!) we’re thrilled to announce unlimited free private repos for all GitHub users, and a new simplified Enterprise off…
  •   @rendyfaqot hi, Sorry to hear. There been some breaking change in the VSTS api... didn't had time yet on fixing tho… https://t.co/lZBMHu4CPf
  •   RT @ameijers: The Global MR Bootcamp was a blast! The biggest #mixedreality event in the world! And all made possible by you the community.…
  •   RT @LocalJoost: Attendants 'working at my Immersive Headset Development workshop at #GlobalMRBootcamp https://t.co/NaNtyO5Ocj
  •   Why do i always decide to change the whole approach of a session the evening before?
  •   @JenMsft @bing it's not working so well for high speed or the distance is a problem https://t.co/KE1kE0wQuF
  •   @danhellem @mmanela Nice!
  •   RT @danhellem: Check out the new changes for the Azure Boards work item tracking experiences in Visual Studio 2019 https://t.co/c4l0rQky1o…
  •   @LocalJoost you put a AAAA battery in your surface pro itself? or the pen?