1

オートフォーカス機能を使用してバーコードを処理する基本的なカメラアプリを作成しようとしています。カメラの焦点が合っているときに押し戻すと、空白の画面に移動し、そこでハングします。例外はスローされません。問題をCaptureImage()メソッドにトレースしました。呼び出されていることがわかりますが、OnCaptureImageAvailableメソッドが呼び出されることはありません。これは、OnNavigatedFromメソッドでOnCaptureImageAvailableのフックを解除しなくても発生します。

   protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        _camera.AutoFocusCompleted -= OnCameraAutoFocusCompleted;
        _camera.CaptureImageAvailable -= OnCaptureImageAvailable;
        _camera.Initialized -= OnCameraInitialized;
        _camera.Dispose();
        _camera = null;
    }

    private void InitializeCamera()
    {
        _camera = new PhotoCamera();
        _camera.Initialized += OnCameraInitialized;
        viewfinderBrush.SetSource(_camera);
    }

    void OnCameraInitialized(object sender, EventArgs e)
    {
        _camera.Initialized -= OnCameraInitialized;
        _camera.AutoFocusCompleted += OnCameraAutoFocusCompleted;
        _camera.CaptureImageAvailable += OnCaptureImageAvailable;

        _camera.FlashMode = FlashMode.Off;
        _camera.Focus(); 
    }

    private void OnCameraAutoFocusCompleted(object sender, EventArgs e)
    {
        _camera.CaptureImage();
    }

    private void OnCaptureImageAvailable(object sender, ContentReadyEventArgs e)
    {
        if (_camera != null && e.ImageStream != null)
            ScanBarcode(e);
    }
4

2 に答える 2

0

問題は、カメラが「_camera.CaptureImage();」での画像のキャプチャでビジー状態のときに、前のページに移動してカメラを廃棄することです。

「doBack」と「captureCompleted」の2つのブールフラグを保持するのはどうですか。

次に、OnCameraAutoFocusCompletedイベントがトリガーされたときに戻らないでください。

private void OnCameraAutoFocusCompleted(object sender, EventArgs e)
    {
        _camera.CaptureImage();
    }

backキーが押されたら、captureCompletedが設定されていない限り、doBackフラグを設定して無視します。

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
    {
        if (!captureCompleted)
        {
            this.doBack = true;
            e.Cancel = true;
        }

        base.OnBackKeyPress(e);
    }

次に、OnCameraCaptureCompletedイベントがトリガーされたときに、doBackフラグが設定されている場合は、captureCompletedフラグを設定して前のページに移動します(カメラを破棄します)。

private void OnCameraCaptureCompleted(object sender, EventArgs e)
    {
        this.captureCompleted = true;

        if (doBack)
        { 
            this.Dispatcher.BeginInvoke(delegate()
            {
                NavigationService.GoBack();
            });
        }
    }
于 2012-04-20T14:00:10.377 に答える
0

viewfinderBrushOnNavigatedFromのソースをクリアしてみます。

また、そこにも処分しない_cameraようにして、それが役立つかどうかを確認してください。

于 2012-04-17T16:47:40.957 に答える