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