Control.DesignMode がなまけてた
UserControl に追加した子コントロールの DesignMode が常に false を返す話。
ユーザーコントロールを作ってみた。 UserControl を継承して作ったコンテナに、 Label や Button を継承したコントロールをぺたぺたと貼り付ける。
しばらくして、作成したユーザーコントロールがデザイナ上ではエラーを発生して表示不能になっていることに気がついた。 Form をデザイナで開くだけでメッセージボックスが表示され、エラータスクが増えてしまう。ユーザーコントロールだけをデザイナで開いても問題はないのに。
なぜゆえに。ただ考えていても収穫はないのでエラー表示を読んでみる。と、そこには、あるファイルが読み込めない旨の FileNotFoundException スタックトレース。
……そこでふと、 Label や Button にはプロパティの設定に従って背景色や文字の太さを変更するコードを足していた事実を思い出す。文字の太さはともかく、背景色は安易に変更できるように設定ファイルに定義する仕様。
そうかコレか、と重い this.DesignMode が false だったときのみ設定ファイルを参照するようコードを書き換える。書き換えたのに、 Exception は変わらない。せいぜいコードの更新を反映して、スタックトレース中の行番号が変わったぐらい。
つまり DesignMode を含んだコードが認識されていないのではなく、 DesignMode が役割を果たしていない。なぜだ。
ということで検索してみる。こちらのページによると、どうやら UserControl の子コントロールの DesignMode がうそつきサンと化す場合があるらしい。
仕方ないので System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv"
を使って代用する。
ようやく思うとおりの動作になった。
ひどいよー。