Jak stworzyć "waiting messagebox"?

0

Witam,
chcę stworzyć wyskakujące okienko MessageBox, które nie będzie posiadało żadnych buttonów oraz zamknięcie tego okienka następować będzie automatycznie po wykonaniu metody. Ma być to okienko informujące,że metoda Metoda() jest wykonywana i tyle.
Próbuję ze zwykłą klasą MessageBox, ale tak chyba nie da się tego osiągnąć? Czy muszę tworzyć dodatkowe okno w wpf, które będę wyświetlał?
Pozdrawiam

0

Te okno to ma się zachowywać jak dialog? Czyli nie pozwolić kliknąć na coś w głównym oknie?

0

Jest kilka opcji, dwie z nich:

  • tworzysz własne okno wyglądające jak messagebox i zamykasz je (lub korzystasz z gotowca znalezionego na necie),
  • używasz standardowego message boxa i za pomocą windows API zamykasz je (FindWindow + SendMessage) - coś takiego jak to: http://stackoverflow.com/a/26656324
0

Cześć

  1. WTF z tymi komentami ?
  2. Musisz utworzyć swoją kontrolkę a następnie pokazać metodą Show.
    Podro.
0

Jest jeszcze taki problem że wyświetlenie jako dialog zatrzymuje program i czeka na akcję użytkownika, trzeba by pewnie tą metodę uruchomić w nowym wątku.

0

Dlatego napisałem o Show a nie ShowDialog

0
  • Albo tak jak napisali wyżej - użyj Show + form.Enabled = false; I form.Enabled = true; jak skonczysz liczyc

Lub coś w ten deseń: (opcja wyzej jest latwiejsza)

Task task = Task.Factory.StartNew(() => { /* obliczenia w tle */; ZamknijDialog(); });
dialog.ShowDialog();
0

Ok, postanowiłem zrobić oddzielne okienko. Działanie tj. otworzenie i zamknięcie okna po skończeniu metody działa dobrze(dodatkowo dodałem

 protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if(Zamknij==0)
            {e.Cancel = true;}
        }

żeby użytkownik sam nie mógł zamknąć okna. Jest tylko problem, że podczas pokazania okienka, nie łądują się kontrolki...Pojawia się puste, białe okno. W xamlu mam label tylko, a kod wygląda tak:

public partial class OknoDialogowe : Window
    {
        public int Zamknij { get; set; }
        public OknoDialogowe()
        {
            Zamknij = 0;
            InitializeComponent();
        }
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if(Zamknij==0)
            {e.Cancel = true;}
        }
    }

edit: Dla jasności, kontorlki tego okna ładują się dopiero po ukończeniu metody

1

Pokaż jak to uruchamiasz.
Możesz ustawić WindowStyle na None, wtedy user nie będzie miał czym zamknąć okna.

0
 private void twierdzenie_Click(object sender, RoutedEventArgs e)
        {
            OknoDialogowe okno = new OknoDialogowe();
            okno.Show();
            zatwierdz_zmiany();
            okno.Zamknij = 1;
            okno.Close();
        }
0

Może ktoś mnie naprowadzić dlaczego kontrolki tego okienka nie inicjiują się od razu? Myślę nad tym od wczoraj, ale nie mam pomysłu...

0

No bo przecież ta metoda zatwierdzZmiany musi lecieć w nowym wątku.

0

Poczytaj co to jest pętla komunikatów- to zrozumiesz dokładnie. Generalnie każde 'rysowanie' oraz interakcja z kontrolkami dzieje się synchronicznie. W metodzie click
tworzysz widok, który narysować się musi w swojej kolejności - po zakończeniu wykonywania click - tak dla uproszczenia.

W zależności jakiej wersji net używasz możesz albo użyć:
ThreadPool
Task
async

Albo tak: http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/

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