简体   繁体   中英

Can't show Dialog box in windows phone 8.1

i am devloping a qrcode scanner custom app for windows phone 8.1. i am using the Nokia Imaging SDK to render the back camera so as to preview the QRCode image, after decoding, i cant display a message dialog. it throws the following exception:

The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))`

here is my code when initializing preview

private async void Init()
{
    //Get back camera
    var devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
    var backCameraId = devices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back).Id;

    //Start preview
    _cameraPreviewImageSource = new CameraPreviewImageSource();
    await _cameraPreviewImageSource.InitializeAsync(backCameraId);
    var properties = await _cameraPreviewImageSource.StartPreviewAsync();

    //Setup preview
    _width = 300.0;
    _height = (_width / properties.Width) * properties.Height;
    var bitmap = new WriteableBitmap((int)_width, (int)_height);

    _writeableBitmap = bitmap;

    PreviewImage.Source = _writeableBitmap;

    _writeableBitmapRenderer = new WriteableBitmapRenderer(_cameraPreviewImageSource, _writeableBitmap);

    _cameraPreviewImageSource.PreviewFrameAvailable += _cameraPreviewImageSource_PreviewFrameAvailable;

    _videoDevice = (VideoDeviceController)_cameraPreviewImageSource.VideoDeviceController;

    //Set timer for auto focus
    if (_videoDevice.FocusControl.Supported)
    {
        var focusSettings = new FocusSettings
        {
            AutoFocusRange = AutoFocusRange.Macro,
            Mode = FocusMode.Auto,
            WaitForFocus = false,
            DisableDriverFallback = false
        };

        _videoDevice.FocusControl.Configure(focusSettings);

        _timer = new DispatcherTimer
        {
            Interval = new TimeSpan(0, 0, 0, 2, 0)
        };
        _timer.Tick += TimerOnTick;
        _timer.Start();
    }

    await _videoDevice.ExposureControl.SetAutoAsync(true);

    _initialized = true;

}

this is how i decode

private async void Deocode(byte[] rawRgb, BitmapFormat bitmapFormat)
{
    await Task.Run(() =>
    {
       if (_decoding)
           return;

       _decoding = true;

       var decoded = _reader.Decode(rawRgb, (int)_width, (int)_height, bitmapFormat);

       if (decoded != null)
       {
           cde = decoded.Text;
           Stop();

       }

       _decoding = false;
   });
   MeesageDialog msg = new MessageDialog(cde);
   await msg.ShowAsync();
}

to perform operation on UI thread you need run code with dispatcher.

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
      {
          MeesageDialog msg = new MessageDialog(cde);
          await msg.ShowAsync();
      });

Try this code (i think it should work).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM