Opóźnienie pokazania MessageBox'a podczas odtwarzania GIF'a

0

Witam
Chciałbym opóźnić pokazanie MessageBox'a na 4 sekundy po tym jak uruchomi się odtwarzanie GIF'a

                    if ((TXT7.Text == "Wygral gracz 1") || (TXT7.Text == "Wygral gracz 2")) { Leo.Visibility = Visibility.Visible; Leo.Play(); }//Leo to MediaElement z GIF'em
                    Stopwatch sw = new Stopwatch();
                    sw.Start();
                    for (int i = 0; ; i++)
                    {
                        if (i % 100000 == 0)
                        {
                            sw.Stop();
                            if (sw.ElapsedMilliseconds > 4000)
                            {
                                break;
                            }
                            else
                            {
                                sw.Start();
                            }
                        }
                    }
                    if (MessageBox.Show("Czy chcecie zagrać jeszcze raz?", "", MessageBoxButton.YesNo) == MessageBoxResult.No)
                    {
                        Close();
                    }
                    else
                    {
                        TXT1.Text = "Gracz 1 podaj liczbę:";
                        tekst1.Text = "";
                        tekst1.Visibility = Visibility.Visible;
                        Leo.Visibility = Visibility.Hidden;
                        Leo.Stop();
                        TXT6.Visibility = Visibility.Hidden;
                        TXT2.Visibility = Visibility.Hidden;
                        TXT3.Visibility = Visibility.Hidden;
                        licznik = 0;
                    }

Niestety w tej formie GIF nie pokazuje się wtedy kiedy powinien, pokazuje się dopiero po 4 sekundach razem z MessegBox'em. Jest taka możliwość w ogóle czy nie ma sensu się męczyć?

0
  1. Pokaż gifa
  2. Uruchom jakiś timer
  3. W zdarzeniu timera zatrzymaj timer i pokaż messageboxa.
0

Zrobiłem tak jak napisałeś i teraz wygląda to tak:

if ((TXT7.Text == "Wygral gracz 1") || (TXT7.Text == "Wygral gracz 2")) Leo.Visibility = Visibility.Visible;
                    odmierzacz = new System.Timers.Timer();
                    odmierzacz.Interval = 4000;
                    odmierzacz.Elapsed += new ElapsedEventHandler(this.Koniect);
                    odmierzacz.Start();

                }
            }
        }
        private void Koniect(object sender, EventArgs e)
        {
            odmierzacz.Stop();
            if (MessageBox.Show("Czy chcecie zagrać jeszcze raz?", "", MessageBoxButton.YesNo) == MessageBoxResult.No)
            {
                Close();
            }
            else
            {
                TXT1.Text = "Gracz 1 podaj liczbę:";
                tekst1.Text = "";
                tekst1.Visibility = Visibility.Visible;
                Leo.Visibility = Visibility.Hidden;
                TXT6.Visibility = Visibility.Hidden;
                TXT2.Visibility = Visibility.Hidden;
                TXT3.Visibility = Visibility.Hidden;
                licznik = 0;
            }
        }

i podczas wykonywania programu dostaję komunikat: System.InvalidOperationException: „Wątek wywołujący nie może uzyskać dostępu do tego obiektu, ponieważ należy on do innego wątku.”
dotyczy on zmiany wartości TXT1.Text

0

Bo timer jest w innym wątku niż UI. Użyj delegata a w nim aktualizacja UI

0

Wybacz ale jestem początkujący. Co robię źle bo dalej jest ten sam komunikat pomimo użycia delegata?

public delegate int zaktualizuj(int X);
        private int Aktualizacja(int X)
        {
            TXT1.Text = "Gracz 1 podaj liczbę:";
            tekst1.Text = "";
            tekst1.Visibility = Visibility.Visible;
            Leo.Visibility = Visibility.Hidden;
            TXT6.Visibility = Visibility.Hidden;
            TXT2.Visibility = Visibility.Hidden;
            TXT3.Visibility = Visibility.Hidden;
            licznik = 0;
            return 0;
        }
        zaktualizuj akt;
        private void OnKeyDownHandler(object sender, KeyEventArgs e)
        {
            

            if (e.Key == Key.Return)
            {
                if (licznik == 0)
                {
                    int k1 = Los(51);
                    k = k1;
                    a = int.Parse(tekst1.Text);
                    TXT1.Text = "Gracz 2 podaj liczbę:";
                    tekst1.Text = "";
                    licznik++;
                }
                else
                {
                    b = int.Parse(tekst1.Text);
                    tekst1.Visibility = Visibility.Hidden;
                    TXT6.Visibility = Visibility.Visible;
                    TXT1.Text = "komputer:";
                    TXT2.Visibility = Visibility.Visible;
                    TXT3.Visibility = Visibility.Visible;
                    for (int i = 0; i < k; i++)
                    {
                        gwiazdka_k += gwiazdka;
                    }
                    for (int i = 0; i < a; i++)
                    {
                        gwiazdka_a += gwiazdka;
                    }
                    for (int i = 0; i < b; i++)
                    {
                        gwiazdka_b += gwiazdka;
                    }
                    TXT6.Text = gwiazdka_k;
                    TXT4.Text = gwiazdka_a;
                    TXT5.Text = gwiazdka_b;
                    int w1=-1, w2=-1;
                    sprawdz(k, a, b,ref w1,ref w2);
                    TXT9.Text = Komentarz(w1);
                    TXT10.Text = Komentarz(w2);
                    TXT7.Text = Wygral(w1, w2);
                    akt = new zaktualizuj(Aktualizacja);

                    if ((TXT7.Text == "Wygral gracz 1") || (TXT7.Text == "Wygral gracz 2")) Leo.Visibility = Visibility.Visible;
                    odmierzacz = new System.Timers.Timer();
                    odmierzacz.Interval = 4000;
                    odmierzacz.Elapsed += new ElapsedEventHandler(this.Koniect);
                    odmierzacz.Start();

                }
            }
        }
        public void Koniect(object sender, EventArgs e)
        {
            odmierzacz.Stop();
            if (MessageBox.Show("Czy chcecie zagrać jeszcze raz?", "", MessageBoxButton.YesNo) == MessageBoxResult.No)
            {
                //Close();
            }
            else
            {
                akt(1);
            }
        }
    }
0

możesz sobie zrobić coś takiego, wtedy sobie uśpisz tam wątek na 4 sec.

{
Thread.Sleep(4000);
MessageBox.Show("Hello World");
}
0

this.Invoke(() => {
Aktualizacja(...);
});

0

a w którym miejscu tego użyć? Bo w sumie gdzie bym tego nie wkleił wyrzuca mi komunikat: Element „MainWindow” nie zawiera definicji „Invoke”, a nie odnaleziono metody rozszerzenia „Invoke”, która przyjmuje pierwszy argument typu „MainWindow” (czy nie brakuje dyrektywy using lub odwołania do zestawu?)
Dodam, że aplikacja jest tworzona w WPF a nie Windows Form

Już zrobiłem sam, dziękuje za pomoc i naprowadzenie z invoke
Jeśli ktoś miałby podobny problem to polecam użycie

Dispatcher.Invoke(new Action(() =>
 {
//aktualizacjaUI
 }));
0

Pewnie Dispatcher.Invoke ale ja się nie znam na tym badziewiu :)

A nie zauważyłem, że już to masz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1