private async void Picker_DialDeviceSelected(DialDevicePicker sender, DialDeviceSelectedEventArgs args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { // The args.SelectedCastingDevice is proxied from the picker process. The picker process is // dismissmed as soon as you break into the debugger. Creating a non-proxied version // allows debugging since the proxied version stops working once the picker is dismissed. DialDevice selectedDevice = await DialDevice.FromIdAsync(args.SelectedDialDevice.Id); // Set the status to connecting try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Connecting); } catch { } // Get the DeviceInformation instance for the the selected device DeviceInformation selectedDeviceInfo = await DeviceInformation.CreateFromIdAsync(selectedDevice.Id); //Get the DialApp object for the specific application on the selected device DialApp app = selectedDevice.GetDialApp(this.dial_appname_textbox.Text); if (app == null) { //Try to create a DIAL device. If it doesn't succeed, the selected device does not support DIAL. rootPage.NotifyUser(string.Format("'{0}' cannot find app with ID '{1}'", selectedDeviceInfo.Name, this.dial_appname_textbox.Text), NotifyType.StatusMessage); try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Error); } catch { } } else { //Get the current application state DialAppStateDetails stateDetails = await app.GetAppStateAsync(); if (stateDetails.State == DialAppState.NetworkFailure) { // In case getting the application state failed because of a network failure rootPage.NotifyUser("Network Failure while getting application state", NotifyType.ErrorMessage); try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Error); } catch { } } else { rootPage.NotifyUser(string.Format("Attempting to launch '{0}'", app.AppName), NotifyType.StatusMessage); //Launch the application on the 1st screen device DialAppLaunchResult result = await app.RequestLaunchAsync(this.dial_launch_args_textbox.Text); //Verify to see whether the application was launched if (result == DialAppLaunchResult.Launched) { rootPage.NotifyUser(string.Format("Launched '{0}'", app.AppName), NotifyType.StatusMessage); //This is where you will need to add you application specific communication between your 1st and 2nd screen applications //... try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Connected); } catch { } } else { rootPage.NotifyUser(string.Format("Attempting to launch '{0}'", app.AppName), NotifyType.StatusMessage); try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Error); } catch { } } } } }); }
private async void Picker_DeviceSelected(DialDevicePicker sender, DialDeviceSelectedEventArgs args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { try { rootPage.NotifyUser(string.Format("Picker DeviceSelected event fired"), NotifyType.StatusMessage); // Set the status to connecting picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Connecting); rootPage.NotifyUser(string.Format("Resolving DialDevice'"), NotifyType.StatusMessage); //Get the DialApp object for the specific application on the selected device DialApp app = args.SelectedDialDevice.GetDialApp(this.dial_appname_textbox.Text); if (app == null) { //Try to create a DIAL device. If it doesn't succeed, the selected device does not support DIAL. //rootPage.NotifyUser(string.Format("'{0}' cannot find app with ID '{1}'", selectedDeviceInformation.Name, this.dial_appname_textbox.Text), NotifyType.StatusMessage); picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); } else { rootPage.NotifyUser(string.Format("Attempting to launch '{0}'", app.AppName), NotifyType.StatusMessage); //Launch the application on the 1st screen device DialAppLaunchResult result = await app.RequestLaunchAsync(this.dial_launch_args_textbox.Text); //Verify to see whether the application was launched if (result == DialAppLaunchResult.Launched) { rootPage.NotifyUser(string.Format("Launched '{0}'", app.AppName), NotifyType.StatusMessage); activeDialDevice = args.SelectedDialDevice; DeviceInformation selectedDeviceInformation = await DeviceInformation.CreateFromIdAsync(args.SelectedDialDevice.Id); activeDeviceInformation = selectedDeviceInformation; //This is where you will need to add you application specific communication between your 1st and 2nd screen applications //... //... //... picker.SetDisplayStatus(activeDialDevice, DialDeviceDisplayStatus.Connected); picker.Hide(); } else { rootPage.NotifyUser(string.Format("Attempting to launch '{0}'", app.AppName), NotifyType.StatusMessage); picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); } } } catch (Exception ex) { UnhandledExceptionPage.ShowUnhandledException(ex); } }); }
private async void Picker_DialDevicePickerDismissed(DialDevicePicker sender, object args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { // Resume video playback this.player.Play(); }); }
private async void Picker_DisconnectButtonClicked(DialDevicePicker sender, DialDisconnectButtonClickedEventArgs args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { try { rootPage.NotifyUser(string.Format("Picker DisconnectButtonClicked event fired for device '{0}'", activeDeviceInformation.Name), NotifyType.StatusMessage); // Get the DialDevice instance for the selected device DialDevice selectedDialDevice = await DialDevice.FromIdAsync(args.Device.Id); // Update the picker status picker.SetDisplayStatus(selectedDialDevice, DialDeviceDisplayStatus.Connecting); DialApp app = selectedDialDevice.GetDialApp(this.dial_appname_textbox.Text); //Get the current application state //DialAppStateDetails stateDetails = await app.GetAppStateAsync(); DialAppStopResult result = await app.StopAsync(); if (result == DialAppStopResult.Stopped) { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser("Application stopped successfully.", NotifyType.StatusMessage); picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Disconnected); activeDialDevice = null; activeDeviceInformation = null; picker.Hide(); } else { if (result == DialAppStopResult.StopFailed || result == DialAppStopResult.NetworkFailure) { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser(string.Format("Error occured trying to stop application. Status: '{0}'", result.ToString()), NotifyType.StatusMessage); picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Error); } else //in case of DialAppStopResult.OperationNotSupported, there is not much more you can do. You could implement your own // mechanism to stop the application on that device. { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser(string.Format("Stop is not supported by device: '{0}'", activeDeviceInformation.Name), NotifyType.ErrorMessage); activeDialDevice = null; activeDeviceInformation = null; } } } catch (Exception ex) { UnhandledExceptionPage.ShowUnhandledException(ex); } }); }
private void InitDialDeivcePicker() { if (picker == null) { picker = new DialDevicePicker(); // 設定支援的 app name picker.Filter.SupportedAppNames.Add("castingsample"); picker.DialDevicePickerDismissed += Picker_DialDevicePickerDismissed; picker.DialDeviceSelected += Picker_DialDeviceSelected; picker.DisconnectButtonClicked += Picker_DisconnectButtonClicked; } }
private async void Picker_DisconnectButtonClicked(DialDevicePicker sender, DialDisconnectButtonClickedEventArgs args) { // casting 必須在 UI Thread 下執行 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { try { // 取得被選擇的 dial device DialDevice selectedDialDevice = await DialDevice.FromIdAsync(args.Device.Id); // 更新 picker status picker.SetDisplayStatus(selectedDialDevice, DialDeviceDisplayStatus.Connecting); // 取得 dial app DialApp app = selectedDialDevice.GetDialApp(txtAppName.Text); // 請求斷綫 DialAppStopResult result = await app.StopAsync(); if (result == DialAppStopResult.Stopped) { picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Disconnected); activeDialDevice = null; activeDeviceInformation = null; picker.Hide(); tblMsg.Text += "Stoped, success"; } else { if (result == DialAppStopResult.StopFailed || result == DialAppStopResult.NetworkFailure) { // 如果失敗的話要記得多 retry 的機制 picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Error); tblMsg.Text += $"Stoped, {result}"; } else { // 如果設備沒有支援 Stop 機制,則直接清楚連綫就好 activeDialDevice = null; activeDeviceInformation = null; tblMsg.Text += "the device does not support Stop"; } } } catch (Exception ex) { tblMsg.Text += ex.Message; } }); }
private async void Picker_DisconnectButtonClicked(DialDevicePicker sender, DialDisconnectButtonClickedEventArgs args) { // casting 必須在 UI Thread 下執行 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { try { // 取得被選擇的 dial device DialDevice selectedDialDevice = await DialDevice.FromIdAsync(args.Device.Id); // 更新 picker status picker.SetDisplayStatus(selectedDialDevice, DialDeviceDisplayStatus.Connecting); // 取得 dial app DialApp app = selectedDialDevice.GetDialApp(txtAppName.Text); // 請求斷綫 DialAppStopResult result = await app.StopAsync(); if (result == DialAppStopResult.Stopped) { picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Disconnected); activeDialDevice = null; activeDeviceInformation = null; picker.Hide(); tblMsg.Text += "Stoped, success"; } else { if (result == DialAppStopResult.StopFailed || result == DialAppStopResult.NetworkFailure) { // 如果失敗的話要記得多 retry 的機制 picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Error); tblMsg.Text += $"Stoped, {result}"; } else { // 如果設備沒有支援 Stop 機制,則直接清楚連綫就好 activeDialDevice = null; activeDeviceInformation = null; tblMsg.Text += "the device does not support Stop"; } } } catch (Exception ex) { tblMsg.Text += ex.Message; } }); }
public Scenario03() { this.InitializeComponent(); rootPage = MainPage.Current; //Subscribe to player events player.MediaOpened += Player_MediaOpened; player.MediaFailed += Player_MediaFailed; player.CurrentStateChanged += Player_CurrentStateChanged; // Get an Azure hosted video AzureDataProvider dataProvider = new AzureDataProvider(); video = dataProvider.GetRandomVideo(); //Set the source on the player rootPage.NotifyUser(string.Format("Opening '{0}'", video.Title), NotifyType.StatusMessage); this.player.PosterSource = new BitmapImage(video.Thumbnail); this.player.Source = video.VideoLink; //Subscribe for the clicked event on the custom cast button ((MediaTransportControlsWithCustomCastButton)this.player.TransportControls).CastButtonClicked += TransportControls_CastButtonClicked; //Configure the DIAL launch arguments for the current video this.dial_launch_args_textbox.Text = string.Format("v={0}&t=0&pairingCode=E4A8136D-BCD3-45F4-8E49-AE01E9A46B5F", video.Id); //Subscribe for the clicked event on the custom cast button ((MediaTransportControlsWithCustomCastButton)this.player.TransportControls).CastButtonClicked += TransportControls_CastButtonClicked; // Instantiate the Device Picker picker = new DialDevicePicker(); //Add the DIAL Filter, so that the application only shows DIAL devices that have // the application installed or advertise that they can install them. picker.Filter.SupportedAppNames.Add(this.dial_appname_textbox.Text); //Hook up device selected event picker.DialDeviceSelected += Picker_DialDeviceSelected; //Hook up the picker disconnected event picker.DisconnectButtonClicked += Picker_DisconnectButtonClicked; //Hook up the picker dismissed event picker.DialDevicePickerDismissed += Picker_DialDevicePickerDismissed; }
private async void Picker_DialDeviceSelected(DialDevicePicker sender, DialDeviceSelectedEventArgs args) { // casting 必須在 UI Thread 下執行 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { try { // 設定遠端設備現在要準備連綫 picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Connecting); // 取得遠端設備中支援指定 app name 的 App DialApp app = args.SelectedDialDevice.GetDialApp(txtAppName.Text); if (app == null) { // 嘗試建立 DIAL device,如果失敗代表那個設備不支援 DIAL picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); } else { // 請求送出參數到遠端設備的 App DialAppLaunchResult result = await app.RequestLaunchAsync(txtArgument.Text); if (result == DialAppLaunchResult.Launched) { activeDialDevice = args.SelectedDialDevice; DeviceInformation selectedDeviceInformation = await DeviceInformation.CreateFromIdAsync(args.SelectedDialDevice.Id); activeDeviceInformation = selectedDeviceInformation; picker.SetDisplayStatus(activeDialDevice, DialDeviceDisplayStatus.Connected); picker.Hide(); tblMsg.Text += "device connected"; } else { picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); tblMsg.Text += "device error"; } } } catch (Exception ex) { tblMsg.Text += ex.Message; } }); }
public Scenario03() { this.InitializeComponent(); rootPage = MainPage.Current; //Subscribe to player events player.MediaOpened += Player_MediaOpened; player.MediaFailed += Player_MediaFailed; player.CurrentStateChanged += Player_CurrentStateChanged; // Get an Azure hosted video AzureDataProvider dataProvider = new AzureDataProvider(); video = dataProvider.GetRandomVideo(); //Set the source on the player rootPage.NotifyUser(string.Format("Opening '{0}'", video.Title), NotifyType.StatusMessage); this.player.Source = video.VideoLink; //Subscribe for the clicked event on the custom cast button ((MediaTransportControlsWithCustomCastButton)this.player.TransportControls).CastButtonClicked += TransportControls_CastButtonClicked; //Configure the DIAL launch arguments for the current video this.dial_launch_args_textbox.Text = string.Format("v={0}&t=0&pairingCode=E4A8136D-BCD3-45F4-8E49-AE01E9A46B5F", video.Id); //Subscribe for the clicked event on the custom cast button ((MediaTransportControlsWithCustomCastButton)this.player.TransportControls).CastButtonClicked += TransportControls_CastButtonClicked; // Instantiate the Device Picker picker = new DialDevicePicker(); //Add the DIAL Filter, so that the application only shows DIAL devices that have // the application installed or advertise that they can install them. picker.Filter.SupportedAppNames.Add(this.dial_appname_textbox.Text); //Hook up device selected event picker.DialDeviceSelected += Picker_DeviceSelected; //Hook up the picker disconnected event picker.DisconnectButtonClicked += Picker_DisconnectButtonClicked; //Hook up the picker dismissed event picker.DialDevicePickerDismissed += Picker_DevicePickerDismissed; }
private async void Picker_DevicePickerDismissed(DialDevicePicker sender, object args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { try { rootPage.NotifyUser(string.Format("Picker DevicePickerDismissed event fired for device"), NotifyType.StatusMessage); if (activeDialDevice != null) { // Resume video playback this.player.Play(); } } catch (Exception ex) { UnhandledExceptionPage.ShowUnhandledException(ex); } }); }
private void Picker_DialDevicePickerDismissed(DialDevicePicker sender, object args) { // 處理如果用戶沒有選擇 device 的時候要幹嘛 }
public DialDevicePickerEvents(DialDevicePicker This) { this.This = This; }
private async void Picker_DeviceSelected(DialDevicePicker sender, DialDeviceSelectedEventArgs args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { try { rootPage.NotifyUser(string.Format("Picker DeviceSelected event fired"), NotifyType.StatusMessage); // Set the status to connecting picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Connecting); rootPage.NotifyUser(string.Format("Resolving DialDevice'"), NotifyType.StatusMessage); //Get the DialApp object for the specific application on the selected device DialApp app = args.SelectedDialDevice.GetDialApp(this.dial_appname_textbox.Text); if (app == null) { //Try to create a DIAL device. If it doesn't succeed, the selected device does not support DIAL. //rootPage.NotifyUser(string.Format("'{0}' cannot find app with ID '{1}'", selectedDeviceInformation.Name, this.dial_appname_textbox.Text), NotifyType.StatusMessage); picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); } else { rootPage.NotifyUser(string.Format("Attempting to launch '{0}'", app.AppName), NotifyType.StatusMessage); //Launch the application on the 1st screen device DialAppLaunchResult result = await app.RequestLaunchAsync(this.dial_launch_args_textbox.Text); //Verify to see whether the application was launched if (result == DialAppLaunchResult.Launched) { rootPage.NotifyUser(string.Format("Launched '{0}'", app.AppName), NotifyType.StatusMessage); activeDialDevice = args.SelectedDialDevice; DeviceInformation selectedDeviceInformation = await DeviceInformation.CreateFromIdAsync(args.SelectedDialDevice.Id); activeDeviceInformation = selectedDeviceInformation; //This is where you will need to add you application specific communication between your 1st and 2nd screen applications //... //... //... picker.SetDisplayStatus(activeDialDevice, DialDeviceDisplayStatus.Connected); picker.Hide(); } else { rootPage.NotifyUser(string.Format("Attempting to launch '{0}'", app.AppName), NotifyType.StatusMessage); picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); } } } catch (Exception ex) { UnhandledExceptionPage.ShowUnhandledException(ex); } }); }
private async void Picker_DisconnectButtonClicked(DialDevicePicker sender, DialDisconnectButtonClickedEventArgs args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { try { rootPage.NotifyUser(string.Format("Picker DisconnectButtonClicked event fired for device '{0}'", activeDeviceInformation.Name), NotifyType.StatusMessage); // Get the DialDevice instance for the selected device DialDevice selectedDialDevice = await DialDevice.FromIdAsync(args.Device.Id); // Update the picker status picker.SetDisplayStatus(selectedDialDevice, DialDeviceDisplayStatus.Connecting); DialApp app = selectedDialDevice.GetDialApp(this.dial_appname_textbox.Text); //Get the current application state //DialAppStateDetails stateDetails = await app.GetAppStateAsync(); DialAppStopResult result = await app.StopAsync(); if (result == DialAppStopResult.Stopped) { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser("Application stopped successfully.", NotifyType.StatusMessage); picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Disconnected); activeDialDevice = null; activeDeviceInformation = null; picker.Hide(); } else { if (result == DialAppStopResult.StopFailed || result == DialAppStopResult.NetworkFailure) { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser(string.Format("Error occured trying to stop application. Status: '{0}'", result.ToString()), NotifyType.StatusMessage); picker.SetDisplayStatus(args.Device, DialDeviceDisplayStatus.Error); } else //in case of DialAppStopResult.OperationNotSupported, there is not much more you can do. You could implement your own // mechanism to stop the application on that device. { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser(string.Format("Stop is not supported by device: '{0}'", activeDeviceInformation.Name), NotifyType.ErrorMessage); activeDialDevice = null; activeDeviceInformation = null; } } } catch (Exception ex) { UnhandledExceptionPage.ShowUnhandledException(ex); } }); }
private async void Picker_DialDeviceSelected(DialDevicePicker sender, DialDeviceSelectedEventArgs args) { // casting 必須在 UI Thread 下執行 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { try { // 設定遠端設備現在要準備連綫 picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Connecting); // 取得遠端設備中支援指定 app name 的 App DialApp app = args.SelectedDialDevice.GetDialApp(txtAppName.Text); if (app == null) { // 嘗試建立 DIAL device,如果失敗代表那個設備不支援 DIAL picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); } else { // 請求送出參數到遠端設備的 App DialAppLaunchResult result = await app.RequestLaunchAsync(txtArgument.Text); if (result == DialAppLaunchResult.Launched) { activeDialDevice = args.SelectedDialDevice; DeviceInformation selectedDeviceInformation = await DeviceInformation.CreateFromIdAsync(args.SelectedDialDevice.Id); activeDeviceInformation = selectedDeviceInformation; picker.SetDisplayStatus(activeDialDevice, DialDeviceDisplayStatus.Connected); picker.Hide(); tblMsg.Text += "device connected"; } else { picker.SetDisplayStatus(args.SelectedDialDevice, DialDeviceDisplayStatus.Error); tblMsg.Text += "device error"; } } } catch (Exception ex) { tblMsg.Text += ex.Message; } }); }
private async void Picker_DisconnectButtonClicked(DialDevicePicker sender, DialDisconnectButtonClickedEventArgs args) { //Casting must occur from the UI thread. This dispatches the casting calls to the UI thread. await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { // The args.SelectedCastingDevice is proxied from the picker process. The picker process is // dismissmed as soon as you break into the debugger. Creating a non-proxied version // allows debugging since the proxied version stops working once the picker is dismissed. DialDevice selectedDevice = await DialDevice.FromIdAsync(args.Device.Id); // Get the DeviceInformation instance for the the selected device DeviceInformation selectedDeviceInfo = await DeviceInformation.CreateFromIdAsync(selectedDevice.Id); // Update the picker status try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Disconnecting); } catch { } DialApp app = args.Device.GetDialApp(this.dial_appname_textbox.Text); //Get the current application state DialAppStateDetails stateDetails = await app.GetAppStateAsync(); switch (stateDetails.State) { case DialAppState.NetworkFailure: { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser("Network Failure while getting application state", NotifyType.ErrorMessage); // Update the picker status try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Error); } catch { } break; } case DialAppState.Stopped: { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser("Application was already stopped.", NotifyType.StatusMessage); try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Disconnected); } catch { } break; } default: { DialAppStopResult result = await app.StopAsync(); if (result == DialAppStopResult.Stopped) { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser("Application stopped successfully.", NotifyType.StatusMessage); try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Disconnected); } catch { } } else { if (result == DialAppStopResult.StopFailed || result == DialAppStopResult.NetworkFailure) { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser(string.Format("Error occured trying to stop application. Status: '{0}'", result.ToString()), NotifyType.StatusMessage); try { picker.SetDisplayStatus(selectedDevice, DialDeviceDisplayStatus.Error); } catch { } } else //in case of DialAppStopResult.OperationNotSupported, there is not much more you can do. You could implement your own // mechanism to stop the application on that device. { // In case getting the application state failed because of a network failure, you could add retry logic rootPage.NotifyUser(string.Format("Stop is not supported by device: '{0}'", selectedDeviceInfo.Name), NotifyType.ErrorMessage); } } break; } } }); }