public static void AskReFlashTinker(ParticleDevice particleDevice, Page page, FrameworkElement placementTarget) { var flyout = (Flyout)page.Resources["ReFlashTinkerFlyout"]; var actionButton = FindNameInContainer <Button>(flyout.Content, "ReFlashTinkerButton"); var cancelButton = FindNameInContainer <Button>(flyout.Content, "ReFlashCancelButton"); actionButton.DataContext = particleDevice; RoutedEventHandler actionClickDelegate = null; RoutedEventHandler cancelClickDelegate = null; actionClickDelegate = new RoutedEventHandler(async delegate(object sender, RoutedEventArgs e) { flyout.Hide(); actionButton.Click -= actionClickDelegate; switch (particleDevice.KnownProductId) { case ParticleDeviceType.ParticleCore: await particleDevice.FlashKnownAppAsync("tinker", false); break; case ParticleDeviceType.ParticlePhoton: { StorageFolder installationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; StorageFile firmwareFile = await installationFolder.GetFileAsync("Firmware\\PhotonTinker.bin"); Stream firmwareStream = await firmwareFile.OpenStreamForReadAsync(); await particleDevice.FlashBinaryAsync(firmwareStream, "tinker.bin", false); } break; case ParticleDeviceType.ParticleP1: { StorageFolder installationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; StorageFile firmwareFile = await installationFolder.GetFileAsync("Firmware\\P1Tinker.bin"); Stream firmwareStream = await firmwareFile.OpenStreamForReadAsync(); await particleDevice.FlashBinaryAsync(firmwareStream, "tinker.bin", false); } break; case ParticleDeviceType.ParticleElectron: { // TODO: Warn user about data usage StorageFolder installationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; StorageFile firmwareFile = await installationFolder.GetFileAsync("Firmware\\ElectronTinker.bin"); Stream firmwareStream = await firmwareFile.OpenStreamForReadAsync(); await particleDevice.FlashBinaryAsync(firmwareStream, "tinker.bin", false); } break; } }); cancelClickDelegate = new RoutedEventHandler(delegate(object sender, RoutedEventArgs e) { flyout.Hide(); cancelButton.Click -= cancelClickDelegate; }); actionButton.Click += actionClickDelegate; cancelButton.Click += cancelClickDelegate; flyout.ShowAt(placementTarget); }