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
Jak stworzyć "waiting messagebox"?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 93
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
- Postów: 1589
Te okno to ma się zachowywać jak dialog? Czyli nie pozwolić kliknąć na coś w głównym oknie?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2518
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6
Cześć
- WTF z tymi komentami ?
- Musisz utworzyć swoją kontrolkę a następnie pokazać metodą Show.
Podro.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
- Postów: 1589
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2518
- 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();
- Rejestracja: dni
- Ostatnio: dni
- Postów: 93
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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
- Postów: 1589
Pokaż jak to uruchamiasz.
Możesz ustawić WindowStyle na None, wtedy user nie będzie miał czym zamknąć okna.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 93
private void twierdzenie_Click(object sender, RoutedEventArgs e)
{
OknoDialogowe okno = new OknoDialogowe();
okno.Show();
zatwierdz_zmiany();
okno.Zamknij = 1;
okno.Close();
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 93
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...
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
- Postów: 1589
No bo przecież ta metoda zatwierdzZmiany musi lecieć w nowym wątku.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6
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/