繁体   English   中英

Windows Phone 8.1中无法显示对话框

[英]Can't show Dialog box in windows phone 8.1

我正在开发Windows Phone 8.1的qrcode扫描仪自定义应用程序。 我正在使用诺基亚影像SDK渲染后置摄像头,以便预览QRCode图像,解码后,我无法显示消息对话框。 它引发以下异常:

该应用程序调用了一个已编组为不同线程的接口。 (HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))

这是初始化预览时的代码

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;

}

这就是我解码的方式

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();
}

要在UI线程上执行操作,您需要使用分派器运行代码。

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

试试这个代码(我认为它应该工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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