[〜#〜] wpf [〜#〜]でタブベースの環境を実装するには、フォームをユーザーコントロールに変換する必要がありますが、これを行うときは、Loaded
イベントユーザーコントロールは2回呼び出されます。
インターネットで検索している間、他の人々もこの問題を指摘しました。ロードされたイベントが一度だけ呼び出されるようにするにはどうすればよいですか?複数回呼び出されると、コントロールの初期化が複数回発生するためです。
この ブログ で説明されているように、コントロールがレンダリングされようとする(つまり、ビジュアルツリーに追加される)と、Loadedイベントが発生します。
コントロールが複数回ロード/アンロードされる原因となるコントロールがいくつかあります。たとえば、ネイティブのWPF TabControlは、選択したタブのコンテンツのみをレンダリングします。したがって、新しいタブを選択すると、以前に選択したタブのコンテンツがアンロードされます。以前に選択したタブに戻ってクリックすると、そのコンテンツがリロードされます。
回避策の1つは、他の人によって提案されているように、コントロールを既に初期化しているかどうかを示すブール値を使用することです。または、代わりに Initialized イベントを使用できる場合があります。
ルーティングイベントハンドラーは、最初に行うこととしてLoaded
フックから自分自身を削除できます(そして削除する必要があります)。
public class MyClass : Window
{
public MyClass()
{
Loaded += MyLoadedRoutedEventHandler;
}
void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
{
Loaded -= MyLoadedRoutedEventHandler;
/// ...
}
};
イベントにloaded
フラグを設定します。フラグが既に設定されている場合は、何もしません。