2010-04-12 12 views
38

मैं डब्ल्यूपीएफ में किसी फॉर्म के कुछ कोड अधिभार को चलाने के लिए चाहता हूं। क्या इसे करना संभव है? मैं फॉर्म अधिभार के लिए कोड लिखना कहां नहीं पा रहा हूं।क्या फॉर्म है। WPF में मौजूद है?

नीचे दिए गए प्रतिक्रियाओं के आधार पर ऐसा लगता है कि मैं जो पूछ रहा हूं वह ऐसा नहीं है जो आमतौर पर डब्ल्यूपीएफ में किया जाता है? Vb.Net Winforms में यह आसान है, आप बस ऑनलोड ईवेंट पर जाएं और उस कोड को जोड़ें जो आपको लोड पर चलाना चाहिए। किसी भी कारण से, सी # डब्ल्यूपीएफ में यह बहुत मुश्किल लगता है या ऐसा करने का कोई मानक तरीका नहीं है। क्या कोई मुझे बता सकता है कि ऐसा करने का सबसे अच्छा तरीका क्या है?

+0

क्या आप फॉर्म के नए() मेथिड में काम नहीं करेंगे? –

+0

[यहां देखें] (http://msdn.microsoft.com/en-us/library/ms742302.aspx) – RajeshKdev

उत्तर

72

आप विंडो के Loaded घटना की सदस्यता और ईवेंट हैंडलर में अपना काम कर सकते हैं:

public MyWindow() 
{ 
    Loaded += MyWindow_Loaded; 
} 

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

वैकल्पिक रूप से, अपने परिदृश्य के आधार पर, आप के बजाय OnInitialized में अपने काम करने के लिए सक्षम हो सकता है। दोनों के बीच अंतर की चर्चा के लिए लोडेड इवेंट डॉक्स देखें।

+0

आप XAML की बजाय निर्माता में ईवेंट की सदस्यता क्यों लेते हैं? –

+16

क्योंकि यह मेरे लिए तर्कसंगत रूप से कोड का हिस्सा है - व्यवहार - दृश्य के बजाय (यह वर्चुअल ऑनलोडेड विधि की कमी के लिए एक समाधान है)। उदाहरण के लिए, अगर मुझे ब्लेंड में संपादन के लिए ग्राफिक डिजाइनर को एक्सएएमएल देना था, तो मैं उन्हें लोडेड इवेंट हैंडलिंग को संशोधित करने में सक्षम नहीं होना चाहूंगा। हालांकि यह एक मामूली कॉल है! – itowlson

+1

+1 - मैं पूरी तरह से आपसे सहमत हूं ... – Brent

21

विंडो की लोड की गई घटना का उपयोग करें। आप नीचे दिए गए जैसे XAML में यह कॉन्फ़िगर कर सकते हैं:

<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 घटना कैसा दिखेगा है:

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

यह अन्य समाधान की तुलना में मेरे लिए बेहतर काम करता है। धन्यवाद! – jonatr

+0

आप इसे कमांड पर कैसे रूट करेंगे? – Thomas

-1

यह सवाल 4 साल पहले कहा गया था, लेकिन इस सवाल का जवाब दूसरों भी तो मदद मिल सकती है यहां जाता है -> इसे आसानी से और तेज़ी से करने के लिए - नीचे और गंदे, उस कोड को रखें जिसे आप कोड-बैक में किसी विधि में चलाना चाहते हैं। तो बस MainWindow() InitializeComponent() से पहले विधि को कॉल करें। यह खतरे पैदा करता है, लेकिन ज्यादातर बार यह काम करता है क्योंकि घटक खिड़की की शुरुआत/प्रदर्शन से पहले लोड होते हैं। (यह मेरी परियोजनाओं में से एक से कोड काम कर रहा है।) मान लीजिए कि ऐप आग लगने पर आप एक छोटी तरंग फ़ाइल खेलना चाहते हैं। यह इस तरह दिखेगा;

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

उम्मीद है कि यह उन लोगों की सहायता करता है जो खोज रहे हैं। :-)

1

Loaded परियोजना के निर्माण के बाद घटना उठाई जाती है। पहले सामान करने के लिए, आप App.xaml.cs में OnStartup विधि को ओवरवइड कर सकते हैं।

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     //... 
     base.OnStartup(e); 
    } 
} 
संबंधित मुद्दे