C#
WPF

WPFでSizeToContentを使うとLoadedイベントが呼ばれないことがある

Loadedイベントの処理がなぜか動かない

なぜかWPFのある画面でだけLoadedイベントの処理が呼ばれず、エラーにもならないという現象が発生しました。全然理由が分からなかったのですがどうも以下の現象のようです。

Existence of SizeToContent in XAML breaks Loaded Event of window

日本語の情報がなさそうだったので、もしかしたら同じ現象に遭遇した方の助けになるかもしれないので記事に残しておきます。

現象の起きる条件

上記のGithubのページによると、以下を満たしている時に、Loadedイベントの処理が呼ばれないことがあるようです。

  • SizeToContentプロパティでManual以外を指定している
  • EventTriggerでLoadedイベントをフックしている
  • .NET Framework 4.7より前?(厳密なバージョンは不明です) 1

残念ながら上記の条件は完全ではないようで、上記を満たしていてもコードの書き方によっては起きなかったりもします。現象の本質としてはLoadedイベントが呼ばれていないのではなく、Loadedが起きてからイベントがバインドされてしまっているのだと推測されます。そのため、微妙な書き方の差で起きたり起きなかったりするのだと思われます。上記のGithubのIssueに添付されているサンプルプロジェクトは社内の.NET 4.6.2環境でも現象が再現しました。

対処法

以下のような対処法が考えられます。
※すみませんが責任は負いかねますので、採用するかは各自ご判断ください。

  1. .NET 4.7以降にする?(絶対直るのかは不明・・・) 1
  2. SizeToContentを使うのをあきらめる
  3. LoadedではなくContentRenderedイベントを使う
  4. EventTriggerではなくコードビハインドでLoadedイベントを実装する

  1. コメント欄にてご共有いただきましたが、.NET Framework 4.7.1でも発生するようです。そのため、こちらは対処法とは捉えない方が無難そうです。