2016-04-05 7 views
1

Bir robotu kontrol etmek için görüntüleri yakalayıp işleyeceğimiz bir proje üzerinde çalışıyorum. Bu iki şey gayet iyi çalışıyor.Çok parçalı bir WPF uygulamasında değişen görüntüleri nasıl görüntülerim?

Elde edemediğim şey, işlem öncesi ve sonraki görüntüleri görüntülemek için WPF'nin nasıl kullanılacağıdır.

Bu kodu kullanan bir uygulama var:

Bu görüntüleri açıklayan etiketleri ve 'image.source en kendilerinin hem değiştirir
public CamNotification(string label1, string label2, BitmapSource image1, BitmapSource image2) 

private bool hwLink_SetInfos(CamNotification info) 
{ 
    try 
    { 
     Application.Current.Dispatcher.BeginInvoke((Action)(() => 
     { 
      lblText1.Content = info.Label1; 
      lblText2.Content = info.Label2; 

      ImageBox1.Source = info.Image1; 
      ImageBox2.Source = info.Image2; 
      InvalidateVisual(); 
     })); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Debugger.Break(); 
     return false; 
    } 
} 

.

Çalışıyor ->fine < - kodu çağırmak için bir WPF düğmesi kullandığımda, ancak iki 'image.source'ın yerini alan bir ThreadThread kullanarak bir WorkerThread kullanarak denediğimde, resimler görüntülenmez. etiketler. Zaten düğmeye bastınız ve resimler sergilendi eğer

Üstelik, bir çağrı ->WorkerThread < - MainThread içinde biter görüntüleri kaldırır ve yeni içerik bunları güncelleştirmek yerine boş bir alana bırakır .

Zaten Etiketler güncellenir, tüm crossthead-sorunları kaldırdık ama Dispatcher kullanma "PresentationFramework -> System.Windows.Controls.Image" cleard ve stackoverflow I bakarken

:-(güncellenmiş değil bulunan bu soru:.

WPF imaging problems

o Ancak benim için benzer bir sorunla ilgili gibi görünüyor, ne cevaplar ne de OP o onun sorunu bana yardımcı oldu nasıl çözdüğünü ilgili yorum

.

Bana verebileceğin herhangi bir yardım için minnettar olurum.

+0

Değil dondurulmuş olan görüntü ile ilgili bir sorun gibi geliyor. Kaynağı ayarlamadan önce info.Image1.Freeze() ve info.Image2.Freeze() yöntemini çağırmayı denediniz mi? – Tone

+1

@Tone Bu kadardı. Çok teşekkür ederim. İlgilenenler için: denemeden sonra {ama Dispatcher'dan önce info.image1.Freeze() ve info.image2.Freeze() koydum. Şimdi bir çekicilik gibi çalışır ^^ –

+0

Duymak güzel. Referans için tam bir cevap ekledim. – Tone

cevap

0

BitmapImageSource Eğer

A Freezable nesnesine herhangi değişikliklerin gözlemci bildirmek için bir Değiştirilen olay sağlar MSDN itibaren dişler

genelinde erişmek istiyorsanız dondurulacak edilmelidir bir dondurulabilir nesnedir . Donmuş bir dondurucu, performansını artırabilir, çünkü artık bildirimlerini değiştirmek için kaynakları harcamak zorunda kalmaz. Donmuş bir Dondurulabilir, dondurulmamış Dondurulabilir yapamazken, no'lu dişler arasında da paylaşılabilir.

...

bir dondurulabilir en Freeze yöntem bu kendini güncelleyerek özelliğini devre dışı sağlar. Fırça "donmuş" veya değiştirilemez hale getirmek için bu yöntemi kullanabilirsiniz.

başka iş parçacığı üzerinde görüntülerle çalışıyoruz olarak, bunu UI iş parçacığı üzerinde kullanılmadan önce Freeze() çağırmak için kodunuzu değiştirmeniz gerekir.

public CamNotification(string label1, string label2, BitmapSource image1, BitmapSource image2) 

private bool hwLink_SetInfos(CamNotification info) 
{ 
    try 
    { 
     info.Image1.Freeze(); 
     info.Image2.Freeze(); 

     Application.Current.Dispatcher.BeginInvoke((Action)(() => 
     { 
      lblText1.Content = info.Label1; 
      lblText2.Content = info.Label2; 

      ImageBox1.Source = info.Image1; 
      ImageBox2.Source = info.Image2; 
      InvalidateVisual(); 
     })); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Debugger.Break(); 
     return false; 
    } 
} 

aşağıda bazı çalışma kod ilgili makalelerin bir çift:

How do you pass a BitmapImage from a background thread to the UI thread in WPF?

In what scenarios does freezing WPF objects benefit performance greatly?