• 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

VPS Starter Arubacloud
+1 głos
204 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ź 403 wizyt
pytanie zadane 1 października 2016 w C# przez jankustosz1 Nałogowiec (35,880 p.)
+1 głos
1 odpowiedź 5,931 wizyt
pytanie zadane 18 sierpnia 2016 w C# przez jankustosz1 Nałogowiec (35,880 p.)
0 głosów
1 odpowiedź 349 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...