8

Window_Loaded()XAMLの「WindowLoaded」イベントによって呼び出されるメソッドを作成するコード例を見ました。

<Window x:Class="TestModuleLoader.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
    <Grid>
        ...
    </Grid>
</Window>

しかし、背後のコードでは、コードはコンストラクターとWindow_Loaded()メソッドの両方で機能しました。

using System.Windows;

namespace TestModuleLoader
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //what advantages do I have running code here? 
        }
    }
}

これを行うことに何か利点はありますか?

PreRender()ここで行われているASP.NETのような「ウィンドウロードサイクル」、つまり、などのメソッドについて知っておくと便利なものはありますPostRender()か?

4

2 に答える 2

12

Yes, there is a similar life cycle for WPF controls, just like in ASP.NET. The life cycle of WPF controls is simpler though, as it basically consits of an initialized, loaded, and unloaded event (in that order). See:

http://msdn.microsoft.com/en-us/library/ms754221.aspx

and Mike Hillberg has an excellent article demonstrating the difference between the initalized and loaded events:

http://blogs.msdn.com/mikehillberg/archive/2006/09/19/LoadedVsInitialized.aspx

于 2009-03-16T15:58:28.367 に答える
3

素晴らしいリンク、ラジー。

Edward - 最も興味深い違いは、Contructor が常に Window/Page/UserControl で呼び出される最初のメソッドであり、すべての DependencyProperties が最終値に初期化されているとは考えられないことです。また、コンストラクター内から仮想メソッドを呼び出すことはお勧めできません。

対照的に、Loaded イベントは通常、初期化プロセスの最後に呼び出されます。つまり、Window/Page/UserControl が WPF ElementTree に完全にロードされたときです。ロードされたイベント内から、予期しない結果のリスクなしに、自信を持って任意のメソッドを呼び出し、任意の DepenencyProperty を変更できます。

初期化中に変更されていない場合、Loaded イベントでカスタム依存関係プロパティを初期化するのが良いパターン (現在プロジェクトで使用しています) です。コントロールの場合、このパターンを使用すると、(呼び出しコードからのプロパティ Binding によって) 上書きされる場合に、「高価な」プロパティ (ObservableCollection である DependencyProperty など) の初期化を回避できます。

簡単な答え: コンストラクターを安全にオーバーロードする方法がわからない場合は、Loaded イベントを使用します。

于 2009-03-16T16:43:27.400 に答える