2009-09-17 5 views
5

フォームとUserControlのDesignModeプロパティに関する複数の投稿と質問があります。コントロールがデザインモード(コントロールがVisual Studio Designerに表示されているなど)にあるかどうかを確認し、実行時にのみ実行できるコードは避けてください。 多くの人が見てきた問題は、DesignModeプロパティがコンストラクタで機能せず、入れ子になったコントロールでは機能しないということです。 しかし、これはあなたのコントロールやフォームのLoadイベントハンドラで非常にうまく動作します!!DesignModeプロパティとLicenseManager.UsageModeの使用

フォームまたはユーザーコントロールのコンストラクタのコードは、フォームを読み込む必要のない状態のみを処理する必要があります。 UIオブジェクトの初期化を扱うコードは、コントロールのLoadイベントハンドラに配置する必要があります。その関数では、DesignModeプロパティが機能します。設計者はその時点で適切な値を使用します。

原則として、InitializeComponent()メソッドが呼び出されましたが、実際にはコントロールをデザインビューで表示すると、Designerはその関数を解析し、実行しません。ただし、デザイナはネストされたコントロールのコンストラクタを実行します。 初期化コードをコンストラクタに配置する必要がある場合は、System.ComponentModel.LicenseManagerクラスを使用します。これには、DesignTimeまたはRunTimeの値をとるUsageModeという静的プロパティがあります。あなたはコントロールのコンストラクタでそのプロパティを絶対に信じることができますが、コンストラクタでのみ!

私は現時点で取り組んでいるアプリでは少し微妙なことを忘れていました。この問題を回避するために、私は、余分な初期化を必要とするすべてのコントロールとフォームでLoadイベントのハンドラを実装する必要があるというパターンを守っています。そこで、DesignModeプロパティはうまく動作し、デザイナでユーザーコントロールとフォームを開くのに問題はありません。

私はクラス階層を持っていると、そのイベントハンドラを仮想的に保護することがあります。サブクラスで余分な初期化が必要な場合にのみ、それをオーバーライドします。

I午前思って、しかし、そこにそこに、より良い方法をされている場合、または(何回もLoadイベントハンドラを実装したことを他の?)

+0

非常に参考になりました。ありがとうございます。 –

答えて

2

ために問題のこのパターンについての臭い何かがあればネストされたコントロール(および関連する問題)でDesignModeプロパティを使用して、この問題の私の一般的なアプローチは、私のカスタムUserControlsをデザインモードで機能させることを試みないことです。通常、私のコントロールは非常に複雑でオーナーが描いているので、DesignModeがネストされたコントロールで作業したとしても、設計モードで意味のあるものを表示するためには多大なプログラミング作業が必要になります(そして、コントロールにはかなりの量の初期化とセットアップ時間が必要です)。

通常、すべての作業を実行するパブリックSetup()またはLoadData()メソッドを追加し、実行時にこのメソッドを呼び出すだけです。デザインモードでは、UserControlは正方形として表示され、それを配置するのに役立ちます。

しかし、私はあなたの問題に対処するかもしれないこの質問に他の回答があるかどうかを知ることに興味があります。

+0

特に、サブクラス化したい場合は、デザインビューでコントロールを見ることができるのが本当に便利です。そうでなければ、少なくともフォームのコントロールのレイアウトのフレームは(あなたのやっているように)うまくいく。 コントロールが多くの標準を使用していて、コントロールのコンポーネントの位置、プロパティ、またはイベントハンドラを調整する必要がある場合、現実的な外観のデザインビューが重要になります。 さらに、自分のコントロールがコードを持っていないかもしれない人が私のコントロールを使うことができることを知っていることは有益だと思います:)。 –

+0

@Sam:皆さんが言うすべてに完全に同意します。時には私のコントロールをデザインモードで動作させることに取り組むこともあります。しかし、私が重大な問題に遭遇するとすぐに、私はいつも辞めますが、時には早すぎることもありません。 – MusiGenesis

関連する問題