web-dev-qa-db-ja.com

WPFユーザーコントロールの読み込まれたイベントが複数回発生する

[〜#〜] wpf [〜#〜]でタブベースの環境を実装するには、フォームをユーザーコントロールに変換する必要がありますが、これを行うときは、Loadedイベントユーザーコントロールは2回呼び出されます

インターネットで検索している間、他の人々もこの問題を指摘しました。ロードされたイベントが一度だけ呼び出されるようにするにはどうすればよいですか?複数回呼び出されると、コントロールの初期化が複数回発生するためです。

33
Muhammad Akhtar

この ブログ で説明されているように、コントロールがレンダリングされようとする(つまり、ビジュアルツリーに追加される)と、Loadedイベントが発生します。

コントロールが複数回ロード/アンロードされる原因となるコントロールがいくつかあります。たとえば、ネイティブのWPF TabControlは、選択したタブのコンテンツのみをレンダリングします。したがって、新しいタブを選択すると、以前に選択したタブのコンテンツがアンロードされます。以前に選択したタブに戻ってクリックすると、そのコンテンツがリロードされます。

回避策の1つは、他の人によって提案されているように、コントロールを既に初期化しているかどうかを示すブール値を使用することです。または、代わりに Initialized イベントを使用できる場合があります。

40
CodeNaked

ルーティングイベントハンドラーは、最初に行うこととしてLoadedフックから自分自身を削除できます(そして削除する必要があります)。

public class MyClass : Window
{
    public MyClass()
    {
        Loaded += MyLoadedRoutedEventHandler;
    }

    void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
    {
        Loaded -= MyLoadedRoutedEventHandler;
        /// ...
    }
};
16
Glenn Slayden

イベントにloadedフラグを設定します。フラグが既に設定されている場合は、何もしません。

2
SLaks