2013-04-19 11 views
5

Mi chiedevo quale sia il modo corretto per rilevare quando una finestra WPF è stata mostrata per la prima volta?Finestra WPF. Come rilevare il primo spettacolo?

Grazie in anticipo.

+0

WinForms ha un evento Mostrato, ma penso che non sia disponibile in WPF. Maye [Inizializzato] (http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.initialized.aspx) è il modo corretto di utilizzare – Jehof

risposta

6

C'è un evento chiamato Loaded che è possibile utilizzare per determinare quando la finestra è pronta.

Da MSDN

Si verifica quando l'elemento è disposto, reso, e pronto per l'interazione.

impostare il gestore in 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> 

aggiungere il code-behind

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

in base a [questo blog MSDN] (http: // blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx), l'evento 'Loaded' si verifica effettivamente prima del primo rendering. –

+1

E l'OP voleva l'equivalente WPF di 'Form.Shown', non l'equivalente di' Form.Loaded'. WPF non rende questa traduzione banale. Questo thread (http://stackoverflow.com/questions/9191256/window-shown-event-in-wpf) suggerisce di sovrascrivere "OnContentRendered" con il tuo flag per tracciare se è la prima volta o meno. –

-1

vorrei suggerire di fare una bandiera bool e controllare, e nel costruttore impostare a true

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

Questo non otterrà mai la clausola 'else' come' OnLoad' viene chiamato sempre una volta. Prima della prima volta la finestra è 'Mostrata'. Il problema dell'OP è che WPF non ha un equivalente banale di 'Window.OnShown'. –

-1

Caricato può essere chiamato più di una volta.

The Loaded event and the Initialized event

Secondo la mia prova e il link qui sopra, evento Loaded può essere licenziato più di una volta.
Quindi, è necessario impostare un flag nel gestore OnLoaded.

Ad esempio, se il pannello Pila si trova all'interno del controllo TabItem, il carico verrà chiamato ogni volta che si passa alla scheda.

+1

Un collegamento a una soluzione è il benvenuto, ma per favore assicurati che la tua risposta sia utile senza di essa: [aggiungi contesto intorno al link] (// meta.stackexchange.com/a/8259) in modo che i tuoi utenti abbiano qualche idea di cosa sia e perché è lì, quindi cita la parte più pertinente della pagina a cui stai collegando nel caso in cui la pagina di destinazione non sia disponibile. [Le risposte che sono poco più di un collegamento possono essere eliminate.] (// stackoverflow.com/help/deleted-answers) – Bugs

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/17173976) – Spektre

Problemi correlati