2010-04-12 5 views
38

Ich möchte Code-Onload eines Formulars in WPF ausführen. Ist es möglich, dies zu tun? Ich bin nicht in der Lage zu finden, wo Code für Formular onload geschrieben werden soll.Gibt es form.onload in WPF?

Gemessen an den Antworten unten scheint es, dass das, was ich frage, nicht etwas ist, das normalerweise in WPF getan wird? In Vb.Net Winforms ist es einfach, Sie gehen einfach auf das Onload-Ereignis und fügen den Code hinzu, den Sie beim Laden ausführen müssen. Aus welchem ​​Grund auch immer, in C# WPF scheint es sehr schwierig zu sein oder es gibt keinen Standard Weg dies zu tun. Kann mir bitte jemand sagen, was der beste Weg ist, dies zu tun?

+0

Würdest du nicht Code in der New() Methid des Formulars arbeiten? –

+0

[Siehe hier] (http://msdn.microsoft.com/en-us/library/ms742302.aspx) – RajeshKdev

Antwort

72

können Sie auf die Loaded Veranstaltung Fenster abonnieren und tun Sie Ihre Arbeit in den Event-Handler:

public MyWindow() 
{ 
    Loaded += MyWindow_Loaded; 
} 

private void MyWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    // do work here 
} 

Alternativ auf Ihrem Szenario abhängig, Sie in der Lage sein können, Ihre Arbeit in OnInitialized stattdessen zu tun. Eine Erläuterung des Unterschieds zwischen den beiden finden Sie in den Loaded-Ereignisdokumenten.

+0

Warum abonnieren Sie das Ereignis im Konstruktor statt im XAML? –

+16

Da dies für mich ist logisch Teil des Codes - das Verhalten - und nicht die Ansicht (es ist ein Workaround für das Fehlen einer virtuellen OnLoaded-Methode). Wenn ich beispielsweise einem Grafikdesigner den XAML zur Bearbeitung in Blend übergeben müsste, wäre es mir lieber, wenn er die Loaded-Ereignisbehandlung nicht ändern könnte. Es ist jedoch ein marginaler Anruf! – itowlson

+1

+1 - Ich stimme völlig mit Ihnen überein ... – Brent

21

Verwenden Sie das Loaded-Ereignis des Fensters. Sie können diese wie in der unten stehenden XAML konfigurieren:

<Window x:Class="WpfTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Your App" Loaded="Window_Loaded"> 

Hier ist, was ist das Window_Loaded Ereignis aussehen würde:

wurde
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // do stuff 
} 
+0

dies funktionierte besser für mich als die andere Lösung. Vielen Dank! – jonatr

+0

Wie würden Sie dies zu einem Befehl leiten? – Thomas

-1

Diese Frage vor 4 Jahren gefragt, aber diese Antwort kann anderen helfen, auch so hier geht -> Um es einfach und schnell zu tun - down und dreckig, legen Sie den Code, den Sie ausführen möchten, in eine Methode im Code-Behind. Rufen Sie dann einfach die Methode vor der MainWindow() InitializeComponent() an. Dies stellt Gefahren dar, aber meistens funktioniert es, weil die Komponenten vor der Fensterinitiierung/-anzeige geladen werden. (Dies funktioniert Code aus einem meiner Projekte.) Angenommen, Sie möchten eine Kurzwelle-Datei wiedergeben, wenn die App gestartet wird. Es würde so aussehen;

using ... 
using System.Windows.Media; 

namespace yourNamespace_Name 
{ 
    /// sumary > 
    /// Interaction logic for MainWindow.xaml 
    /// /sumary> 
    public partial class MainWindow : System.Windows.Window 
    { 
     public MainWindow() 
     { 
      /*call your pre-written method w/ all the code you wish to 
      * run on project load. It is wise to set the method access 
      * modifier to 'private' so as to minimize security risks.*/ 
      playTada(); 

      InitializeComponent(); 
     } 

     private void playTada() 
     { 
      var player = new System.Media.SoundPlayer(); 
      player.Stream = Properties.Resources.tada; 
      // add the waveFile to resources, the easiest way is to copy the file to 
      // the desktop, resize the IDE window so the file is visible, right 
      // click the Project in the solution explorer & select properties, click 
      // the resources tab, & drag and drop the wave file into the resources 
      // window. Then just reference it in the method. 
      // for example: "player.Stream = Properties.Resources.tada;"   
      player.Play(); 
      //add garbage collection before initialization of main window 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 
    } 
} 

Hoffe das hilft denen, die suchen. :-)

1

Loaded Ereignis wird ausgelöst, nachdem das Projekt erstellt wurde. Um Sachen vorher zu tun, können Sie OnStartup Methode in App.xaml.cs ovvverid.

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     //... 
     base.OnStartup(e); 
    } 
} 
Verwandte Themen