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.
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.
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;
}
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. –
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. –
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
}
}
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'. –
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.
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
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
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