2010-04-12 14 views
38

WPF'de bir formun yüklenme kodunu çalıştırmak istiyorum. Bunu yapmak mümkün mü? Form yükü için kodun nereye yazılacağını bulamıyorum. tipik WPF yapılan bir şey değil ne Soruyorum gibi görünüyor altındaWPF'de form.onload var mı?

yanıtları bakılırsa? Vb.Net winforms'da bu kolay, sadece onload olayına gidip yükte koşmanız gereken kodu ekleyin. Hangi nedenle olursa olsun, C# WPF'de çok zor görünüyor ya da bunu yapmak için standart bir yol yok. Birisi bana bunu yapmanın en iyi yolunun ne olduğunu söyleyebilir mi?

+0

Formdaki New() methid içinde kod çalışması yapmaz mısınız? –

+0

[Buraya bakın] (http://msdn.microsoft.com/en-us/library/ms742302.aspx) – RajeshKdev

cevap

72

Sen Pencere Loaded olaya abone ve olay işleyicisi çalışmanızı yapabilirsiniz:

public MyWindow() 
{ 
    Loaded += MyWindow_Loaded; 
} 

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

Alternatif olarak, senaryoya göre, bunun yerine OnInitialized çalışmanızı yapmak mümkün olabilir. İkisi arasındaki farkı tartışmak için Yüklenen etkinlik dokümanlarına bakın.

+0

Neden XAML yerine yapıcıdaki etkinliğe abone oluyorsunuz? –

+16

Bu benim için mantıksal olarak kodun bir parçası - görünümden ziyade davranış - bir sanal OnLoaded yönteminin olmaması için bir çözümdür. Örneğin, XAML’i Blend’te düzenleme yapmak için bir grafik tasarımcısına vermek zorunda kalsaydım, Yüklenmiş olay işlemeyi değiştirememelerini tercih ederim. Yine de marjinal bir çağrı! – itowlson

+1

+1 - Sizinle tamamen aynı fikirdeyim ... – Brent

21

Pencerenin Yüklenmiş olayını kullanın. Aşağıdaki gibi XAML bu yapılandırabilirsiniz:

İşte
<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"> 

Window_Loaded olay gibi görünür budur:

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

bu benim için diğer çözümden daha iyi çalıştı. Teşekkürler! – jonatr

+0

Bunu bir komuta nasıl yönlendirirsiniz? – Thomas

-1

Bu soru 4 yıl önce istendi, ancak bu cevabı da öyle başkalarına yardım edebilir işte gidiyor -> Bunu basit ve hızlı bir şekilde yapmak için aşağı ve kirli, kod arkasında bir yöntemle çalıştırmak istediğiniz kodu koyun. daha sonra MainWindow() InitializeComponent()'dan önce yöntemi çağırmanız yeterlidir. Bu tehlikeler ortaya çıkarır, ancak çoğu zaman çalışır çünkü bileşenler pencere başlatma/gösterilmeden önce yüklenir. (Bu projelerimin birinden kod çalışıyor.) Uygulama başlatıldığında kısa bir dalga dosyası oynatmak istediğinizi varsayalım. Böyle görünüyordu;

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(); 
     } 
    } 
} 

Bu, arama yapanlara yardımcı olur. Proje inşa sonra :-)

1

Loaded olayı oluşturulur. Daha önce bir şeyler yapmak için, App.xaml.cs'da OnStartup yöntemini ovveride yapabilirsiniz.

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