public static void AskRenameDevice(ParticleDevice particleDevice, Page page, FrameworkElement placementTarget)
        {
            var flyout            = (Flyout)page.Resources["RenameDeviceFlyout"];
            var newDeviceNameGrid = FindNameInContainer <Grid>(flyout.Content, "NewDeviceNameGrid");
            var textbox           = FindNameInContainer <TextBox>(flyout.Content, "NewDeviceName");
            var refreshButton     = FindNameInContainer <Button>(flyout.Content, "RefreshButton");
            var actionButton      = FindNameInContainer <Button>(flyout.Content, "RenameDeviceButton");
            var cancelButton      = FindNameInContainer <Button>(flyout.Content, "RenameCancelButton");

            textbox.Text = DeviceNameGenerator.GenerateUniqueName(TinkerData.GetDeviceNames());
            textbox.SelectAll();

            actionButton.DataContext = particleDevice;

            RoutedEventHandler refreshButtonDelegate = null;
            RoutedEventHandler actionClickDelegate   = null;
            RoutedEventHandler cancelClickDelegate   = null;

            refreshButtonDelegate = new RoutedEventHandler(delegate(object sender, RoutedEventArgs e)
            {
                textbox.Text = DeviceNameGenerator.GenerateUniqueName(TinkerData.GetDeviceNames());
                textbox.SelectAll();
            });

            actionClickDelegate = new RoutedEventHandler(async delegate(object sender, RoutedEventArgs e)
            {
                var newName = textbox.Text;

                flyout.Hide();
                refreshButton.Click -= refreshButtonDelegate;
                actionButton.Click  -= actionClickDelegate;
                cancelButton.Click  -= cancelClickDelegate;

                await particleDevice.RenameAsync(newName);
            });

            cancelClickDelegate = new RoutedEventHandler(delegate(object sender, RoutedEventArgs e)
            {
                flyout.Hide();
                refreshButton.Click -= refreshButtonDelegate;
                actionButton.Click  -= actionClickDelegate;
                cancelButton.Click  -= cancelClickDelegate;
            });

            refreshButton.Click += refreshButtonDelegate;
            actionButton.Click  += actionClickDelegate;
            cancelButton.Click  += cancelClickDelegate;

            flyout.ShowAt(placementTarget);
        }