0

コードでイベントを使用して、画像がスキャンされたかどうかを通知します

私のViewModelで:

public BitmapImage ImageSelected
{
   get{return _imageSelected;}
   set
   {
        if (_imageSelected == value)
        {
            return;
        }
        _imageSelected = value;
        RaisePropertyChanged(() => ImageSelected);
   }
}

public ICommand CmdScan
{
   get
   {
       return new DelegateCommand(Scan);
   }
}
WpfTwain twainInterface = null;
private BitmapImage _imageSelected = null;

private void Scan()
{

    twainInterface = new WpfTwain();
    twainInterface.TwainTransfer += new TwainTransferReadyHandler(TwainWin_TwainTransfer);
    twainInterface.Acquire(true);
}


private void TwainWin_TwainTransfer(BitmapImage imageSources)
{
    ImageSelected = imageSources;
}

私の XAML で

<Image Margin="151,12,356,12" Stretch="Fill" Source="{Binding ImageSelected}" />

複数の画像をスキャンする場合、すべてのスキャンが完了するまでウィンドウ内の画像は変更されません.TwainWin_TwainTransferでブレークポイントを作成し、スキャンされたすべての画像とRaisePropertyChangedでも呼び出され、スキャンが完了すると最後の画像のみが表示されます.

どんな提案でも大歓迎です、私はMVVMの初心者です

アップデート

クラス TwainLib のスキャンのコード (によって呼び出されtwainInterface.Acquire(true);ます)

do
{
   pxfr.Count = 0;
   hbitmap = IntPtr.Zero;

   TwImageInfo  iinf = new TwImageInfo();
   rc = DSiinf( appid, srcds, TwDG.Image, TwDAT.ImageInfo, TwMSG.Get, iinf );
   if( rc != TwRC.Success )
   {
      CloseSrc();
      return pics;
   }

   rc = DSixfer( appid, srcds, TwDG.Image, TwDAT.ImageNativeXfer, TwMSG.Get, ref hbitmap );
   if( rc != TwRC.XferDone )
   {
      CloseSrc();
      return pics;
   }

   rc = DSpxfer( appid, srcds, TwDG.Control, TwDAT.PendingXfers, TwMSG.EndXfer, pxfr );
   if( rc != TwRC.Success )
   {
      CloseSrc();
      return pics;
   }
   pics.Add(hbitmap);
   BitmapImage bitmapImage = /*converting hbitmap to BitmapImage  */
   TwainTransferReady(bitmapImage); 
}
while( pxfr.Count != 0 );

twainInterface.Acquire(true);また、タスクで取得しようとし ましたが、同じ結果が得られました。

4

1 に答える 1

0

交換しました

private void TwainWin_TwainTransfer(BitmapImage imageSources)
{
ImageSelected = imageSources;
}

App.Current.MainWindow.Dispatcher.Invoke(DispatcherPriority.Input, new ThreadStart(() => ImageSelected = imageSources));
于 2013-05-14T14:29:50.137 に答える