• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z zmianą image source wpf w innym wątku

Object Storage Arubacloud
+1 głos
206 wizyt
pytanie zadane 25 września 2016 w C# przez jankustosz1 Nałogowiec (35,880 p.)

Witam.

Program wywala błąd gdy korzystam z dipathera że niby nie ma dostępu do właściwości source w image.

To skrócony kod:

 private void buttonGetScreen_Click(object sender, RoutedEventArgs e)
        {
            new Thread(
                delegate ()
                {
                    while (true)
                    {
                        // pobieranie obrazu
                        using (var stream = File.OpenRead(sciezkaDoObrazu))
                        {
                            var bitmap = new BitmapImage();
                            bitmap.BeginInit();
                            bitmap.CacheOption = BitmapCacheOption.OnLoad;
                            bitmap.StreamSource = stream;
                            bitmap.EndInit();
                            Dispatcher.Invoke( () => { imageObraz.Source = bitmap; }); // wywala mi tu z niewiadomych przyczyn błąd że nie ma dostępu do imageObraz image obraz to obraz typu Image w oknie dodany w xaml
                        }
                    }
                }
            ).Start();
        }

 

1 odpowiedź

+1 głos
odpowiedź 2 października 2016 przez PiotrBajer Mądrala (5,300 p.)
wybrane 2 października 2016 przez jankustosz1
 
Najlepsza

Dzieje się tak, ponieważ w linijce 16 odwołujesz się do Dispatchera, który należy do osobnego wątku (tego w którym się dzieje operacja), a wszystkie modyfikacje UI muszą odbywać się w wątku, do któryego należy dany element UI (w Twoim wypadku obraz "imageObraz" należy do innego wątku niż operacje wykonywane po kliknięciu). Spróbuj z poniższym kodem:

private void buttonGetScreen_Click(object sender, RoutedEventArgs e)
{
    new Thread(
        delegate()
        {
            while (true)
            {
                // pobieranie obrazu
                using (var stream = System.IO.File.OpenRead(sciezkaDoObrazu))
                {
                    var bitmap = new BitmapImage();
                    bitmap.BeginInit();
                    bitmap.CacheOption = BitmapCacheOption.OnLoad;
                    bitmap.StreamSource = stream;
                    bitmap.EndInit();
                    bitmap.Freeze();
                    imageObraz.Dispatcher.Invoke(new Action(() => { imageObraz.Source = bitmap; })); // wywala mi tu z niewiadomych przyczyn błąd że nie ma dostępu do imageObraz image obraz to obraz typu Image w oknie dodany w xaml
                }
            }
        }
    ).Start();
}

Zmieniłem tylko linijkę 16 na:
 

imageObraz.Dispatcher.Invoke(new Action(() => { imageObraz.Source = bitmap; })); 

 

komentarz 2 października 2016 przez jankustosz1 Nałogowiec (35,880 p.)
Dzięki wielkie.

Mam 3 pytania

1) zmieniłeś z uri na strumień, po co bo nie wiem, robi to jakąś różnicę?

2) Jak piszę Dispather to chyba odwołuję się do this.Dispather czy do tego w którym jest okno, a chyba w tym samym wątku stworzono okno i ten element image

3) funkcję anonimową wrzuciłeś do klasy action robi to jakąś różnice to to bez znaczenia?

Podobne pytania

0 głosów
1 odpowiedź 419 wizyt
pytanie zadane 1 października 2016 w C# przez jankustosz1 Nałogowiec (35,880 p.)
+1 głos
1 odpowiedź 5,982 wizyt
pytanie zadane 18 sierpnia 2016 w C# przez jankustosz1 Nałogowiec (35,880 p.)
0 głosów
1 odpowiedź 352 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...