2016-10-20 3 views
0

私は最近、FormsからWPFに新しい専門知識を得るために切り替えました。 私はカメラアプリケーションをプログラミングすることを考えました。 カメラは独自の静的クラスでアクセスされます(カメラが1つしかないため、複数のインスタンスは必要ありません)。 UIは、画像コントロールを使用して現在の画像をライブビューで表示することになっています。カメラクラスはBitmapSourceを無限ループで更新します。その画像コントロールのソースとして使用します。WPFイメージを更新する方法。独立した静的クラスの値を変更します。

bitmapSourceの変更によってイメージコントロールが更新されるようにする方法はわかりません。それはどのようにして行われますか?私はPropertychangedeventsについて読んでいますが、このシナリオではどのように実装するのか分かりません。
以前のFormsアプリケーションでは、1秒間に30回フォームを更新し、ピクチャボックスコントロールのソースとしてパブリックビットマップを使用したタイマーがありました。しかし、それは醜い方法であり、私はそれをより良くしたい。

コードは次のようになります。 カメラクラス

static class CameraClass 
{ 
    static Camera myCam = new Camera(); //from API 
    public static BitmapSource CurrentCameraImage; 

    private static void GetCameraImages() 
    { 
     while(true) 
     { 
      myCam.GetImage(out CurrentCameraImage, 1000); //from API 
     } 
    } 

    public static void StartCamera() 
    { 
     myCam.StartAcquisition(); //from API 
     Task.Run(() => { GetCameraImages(); }); 
    } 
} 

標準のWPFクラス

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     CameraClass.StartCamera(); 
     //this should now cause the image control to update 
     //everytime the bitmapsource is changed 
    } 
} 

答えて

0

あなたがWPFについて学びたいと思っ言ったように、あなたがINotifyPropertyChangedを見て、何も悪いことはしないだろう。スタックオーバーフローでサンプルをここでも検索すると、穏やかな紹介が得られます。あなたは通常、データは上記のコード

<Image Source="{Binding CurrentCameraImage}" /> 

に似た何かをイメージソースに、あなたのXAMLイメージを結合することで

は単なる指標であり、私は今のコンピュータではありませんよ。

CameraClassを静的なクラスにすると、Singletonになる可能性があります。

それは意味がありますか?データバインディングの方法があなたのものでない場合(BindingContextの内容を理解する必要がある場合など)、eventを含める方法を見てください。カメラクラスはイベントを定義し、メインクラスはそれ。そのイベントはメインクラスにアップデートが利用可能であることを伝え、UIからカメラから画像を更新できるようにします。

+0

は、私はディ最初のものでした。しかし、それを静的クラスに適用すると、「静的クラスはインターフェイスを実装できません」というエラーが表示されます。 –

+0

あなたはその場合シングルトンに行くことができます。 – rdoubleui

0

通常、WPFアプリケーションはMVVMパターンを実装します。ここで、ビュー要素はビューモデルのプロパティにバインドされます。最も単純なケースでは、アプリケーションのMainWindowプロパティのDataContextプロパティに割り当てられたビューモデルクラスのインスタンスが存在します。

あなたのビューモデルクラスは次のようになります

:あなたはビューモデルのインスタンスを作成し、このようなDataContextプロパティに割り当てますメインウィンドウのコンストラクタで

class CameraViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private Camera camera = new Camera(); 
    private BitmapSource currentCameraImage; 

    public BitmapSource CurrentCameraImage 
    { 
     get { return currentCameraImage; } 
     set 
     { 
      currentCameraImage = value; 
      PropertyChanged?.Invoke(
       this, new PropertyChangedEventArgs("CurrentCameraImage")); 
     } 
    } 

    public async Task StartCamera() 
    { 
     await Task.Run(async() => 
     { 
      while (true) 
      { 
       BitmapSource bitmap; 
       camera.GetImage(out bitmap, 1000); // from API 

       bitmap.Freeze(); // make bitmap cross-thread accessible 
       CurrentCameraImage = bitmap; 
      } 
     }); 
    } 
} 

public MainWindow() 
{ 
    InitializeComponent(); 

    var viewModel = new CameraViewModel(); 
    viewModel.StartCamera(); 

    DataContext = viewModel; 
} 

最後に、ビューモデルのCurrentCameraImageプロパティにバインドされたXAMLのImage要素があります。

<Image Source="{Binding CurrentCameraImage}"/> 

ビューモデルの改良された実装では、タスクはおそらく非同期メソッドで待機する必要があります。 INotifyPropertyChangedのを試みる

+0

しかし、これは実際に静的なクラスnoでこれを行う方法に関する答えではありませんか? –

+0

いいえ、実際にどのように行うべきかを示しています。 StackOverflowの上で、答えは多くの場合、問題は、一般的に解決されるか(一緒に来て、他の人)アスカーを示すために、質問の内容を越えて行きます。 – Clemens

+0

この問題は、一般的な解決法が機能しないため、静的なクラスでこれをどうやって行うのかという点で非常に具体的でした。あなたの答えはドキュメントの書き直しであり、実際の質問には答えません。私は応答には感謝していますが、問題を解決しないため正式に受け付けることはできません。私のプロジェクトでは、静的なクラスを今すぐ削除しましたが、私が他の方法を見つけることができず、私がしたかったからではありません:( –

関連する問題