2017-11-09 14 views
0

Command에 바인드 된 ConnectButton이 있습니다. 그의 Command Im에서 DevicePicker를 호출하고 DeviceSelected Event를 메서드로 설정합니다.DevicePicker.DeviceSelected의 속성 변경 방법

private void connectButtonCommand() 
    { 
     DevicePicker myDevicePicker = new DevicePicker(); 
     myDevicePicker.Show(new Rect(10, 10, 200, 200)); 
     //myDevicePicker.Filter.SupportedDeviceSelectors.Add(BluetoothDevice.GetDeviceSelectorFromPairingState(false)); 
     myDevicePicker.Filter.SupportedDeviceSelectors.Add(BluetoothDevice.GetDeviceSelectorFromPairingState(true)); 
     myDevicePicker.DeviceSelected += MyDevicePicker_DeviceSelected; 


    } 

및 Device_IsConnected 방법과 같은 일부 속성을 설정해야

private async void MyDevicePicker_DeviceSelected(DevicePicker sender, DeviceSelectedEventArgs args) 
    { 
     var deviceInfo = args.SelectedDevice as DeviceInformation; 
     Device = deviceInfo; 

     BluetoothController = new BluetoothController.BluetoothController(); 

     var list = await BluetoothController.FindPairedDevicesAsync(); 

     RefcommDevice = list.First(x => x.Id.Contains(Device.Id)); 

     List<DeviceInformation> deviceList = new List<DeviceInformation>(); 

     deviceList = list.ToList(); 

     Device = deviceList[0]; 

     connected = await BluetoothController.ConnectAsync(RefcommDevice); 

     isConnected = connected; 

     IsConnectedEvent += new IsConnectedEentHandler(Device_IsConnected); 

     if (IsConnected) 
     { 
      if(IsConnectedEvent != null) 
       IsConnectedEvent(); 
     } 



     paired = true; 

    } 

있어서

private void Device_IsConnected() 
    { 
      ConnectButtonVisibility = Visibility.Collapsed; 
      OnButtonVisibility = Visibility.Visible; 
      OffButtonVisibility = Visibility.Visible; 
      ReadDatafButtonVisibility = Visibility.Visible; 

    } 

티가 작동되지 않는다. 다음과 같은 오류가 나타납니다.

System.Runtime.InteropServices.COMException (0x8001010E) : 스레드가 마샬링 된 전쟁으로 인해 전쟁이 끝났습니다. (HRESULT에서 예외 : 0x8001010E (RPC_E_WRONG_THREAD)) System.StubHelpers.EventArgsMarshaler.CreateNativePCEventArgsInstance (문자열 이름)에서 System.Runtime.InteropServices.WindowsRuntime.PropertyChangedEventArgsMarshaler.ConvertToNative (PropertyChangedEventArgs managedArgs)에서 System.ComponentModel.PropertyChangedEventHandler.Invoke에서 (개체 송신자 PropertyChangedEventArgs E)에서 ArduinoDistance.ViewModels.StartPageViewModel ArduinoDistance.ViewModels.StartPageViewModel.set_ConnectButtonVisibility (시정 값)에 ArduinoDistance.ViewModels.BaseViewModel.SetProperty [T (T & 보관소, T 값 문자열 PROPERTYNAME) 에서 . Device_IsConnected()

여기에 이것을 해결할 수있는 간단한 방법이 있습니까? 나는 connectButtonCommand()에서 잠시 동안 (! IsConnected) 설정하여 그것을 해결하고 거기에 내 UI 변경합니다. 그러나 나는 그게 최선의 방법이라고 생각합니다.

편집이 를 사용하여 문제를 해결 : 응용 프로그램 수 없습니다

await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
     testMethod()); 

감사

Agredo 오류가 말한대로

답변

0

을, 문제는 통화가 발생하는 스레드입니다 UI가 아닌 스레드에서 UI 요소를 조작합니다. 이 경우 UI가 아닌 스레드에서 UI 상대 코드를 포함하는 Device_IsConnected 메서드를 호출하는 것이 문제입니다.

이 문제를 해결하려면 Dispatcher.RunAsync을 호출하여 해당 메서드 호출을 UI 스레드로 이동하십시오. 예 :

await Window.Current.Dispatcher.RunAsync(
    Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
{ 
    // Your UI update code goes here! 
    Device_IsConnected(); 
}); 

자세한 내용은 CoreDispatcher을 참조하십시오.

+0

이것은 작동하지 않습니다. \t Window.Current == null 아마도 내 ViewModel에 있기 때문에 어쩌면? – Agredo

+0

감사합니다. 당신의 대답은 많은 도움이되었습니다! – Agredo