2013-04-19 8 views
5

Zastanawiam się, jaki jest właściwy sposób wykrywania, kiedy okna WPF zostały wyświetlone po raz pierwszy?Okno WPF. Jak wykryć pierwszy program?

Z góry dziękuję.

+0

WinForm ma zdefiniowane zdarzenie, ale myślę, że nie jest dostępne w WPF. Maye [Zainicjowano] (http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.initialized.aspx) jest poprawnym sposobem użycia – Jehof

Odpowiedz

6

Istnieje zdarzenie o nazwie Loaded, za pomocą którego można określić, kiedy okno jest gotowe.

Od MSDN

Występuje, gdy element jest rozplanowany, renderowane, i gotowe do interakcji.

ustawić obsługi w XAML

<StackPanel 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="SDKSample.FELoaded" 
Loaded="OnLoad" 
Name="root"> 
</StackPanel> 

dodać opóźnieniem kodu

void OnLoad(object sender, RoutedEventArgs e) 
{ 
    Button b1 = new Button(); 
    b1.Content = "New Button"; 
    root.Children.Add(b1); 
    b1.Height = 25; 
    b1.Width = 200; 
    b1.HorizontalAlignment = HorizontalAlignment.Left; 
} 
+0

Według [tego bloga MSDN] (http: // blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx), zdarzenie "Loaded" faktycznie występuje tuż przed pierwszym renderowaniem. –

+1

I OP chciał ekwiwalentu WPF 'Form.Shown', a nie odpowiednika' Form.Loaded'. WPF nie czyni tego banalnym tłumaczeniem. Ten wątek (http://stackoverflow.com/questions/9191256/window-shown-event-in-wpf) sugeruje nadpisanie 'OnContentRendered' z własną flagą do śledzenia, czy jest po raz pierwszy czy nie. –

-1

proponuję zrobić flagę bool i sprawdzić, w konstruktorze ustawić go do prawdziwej

bool FirstTime = true; 

void OnLoad(object sender, RoutedEventArgs e) 
{ 
    if (FirstTime) 
    { 
      FirstTime = false; 
      //do your stuff first-time 
    } 
    else 
    { 
      //do your stuff for other 
    } 
} 
+2

To nigdy nie dostanie się do klauzuli "else", ponieważ 'OnLoad' jest tylko raz wywoływana. Przed pierwszym razem okno ma postać "Pokazany". Problemem OP jest to, że WPF nie ma trywialnego odpowiednika "Window.OnShown". –

-1

Załadowane można wywołać więcej niż jeden raz.

The Loaded event and the Initialized event

Według moich testów i linku powyżej, Loaded zdarzenie może być zwolniony więcej niż jeden raz.
Musisz więc ustawić flagę w procedurze OnLoaded.

Na przykład, jeśli panel stosu znajduje się wewnątrz elementu sterującego TabItem, ładowany będzie wywoływany za każdym razem, gdy wejdziesz do zakładki.

+1

Link do rozwiązania jest mile widziany, ale upewnij się, że twoja odpowiedź jest przydatna bez niego: [dodaj kontekst związany z linkiem] (// meta.stackexchange.com/a/8259), aby inni użytkownicy mieli pojęcie, co to jest i dlaczego tam jest, a następnie zacytuj najważniejszą część strony, do której prowadzi link, jeśli strona docelowa jest niedostępna. [Odpowiedzi, które są niewiele więcej niż linkem, mogą zostać usunięte.] (// stackoverflow.com/help/deleted-answers) – Bugs

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej jest dołączyć istotne części odpowiedzi tutaj i dostarczyć link do odniesienia. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/17173976) – Spektre