Control.DesignMode がなまけてた

C# .NET の話。最近コレしか触ってない。

UserControl に追加した子コントロールの DesignMode が常に false を返す話。

ユーザーコントロールを作ってみた。 UserControl を継承して作ったコンテナに、 Label や Button を継承したコントロールをぺたぺたと貼り付ける。

しばらくして、作成したユーザーコントロールがデザイナ上ではエラーを発生して表示不能になっていることに気がついた。 Form をデザイナで開くだけでメッセージボックスが表示され、エラータスクが増えてしまう。ユーザーコントロールだけをデザイナで開いても問題はないのに。

なぜゆえに。ただ考えていても収穫はないのでエラー表示を読んでみる。と、そこには、あるファイルが読み込めない旨の FileNotFoundException スタックトレース

……そこでふと、 Label や Button にはプロパティの設定に従って背景色や文字の太さを変更するコードを足していた事実を思い出す。文字の太さはともかく、背景色は安易に変更できるように設定ファイルに定義する仕様。

そうかコレか、と重い this.DesignMode が false だったときのみ設定ファイルを参照するようコードを書き換える。書き換えたのに、 Exception は変わらない。せいぜいコードの更新を反映して、スタックトレース中の行番号が変わったぐらい。

つまり DesignMode を含んだコードが認識されていないのではなく、 DesignMode が役割を果たしていない。なぜだ。

ということで検索してみる。こちらのページによると、どうやら UserControl の子コントロールの DesignMode がうそつきサンと化す場合があるらしい。

仕方ないので System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv" を使って代用する。

ようやく思うとおりの動作になった。

ひどいよー。