2

Treeview をサブクラス化し、インスタンス化時に新しい ImageList (および関連付けられたイメージ) をロードします。

デザイナー ビューに切り替えるたびに、このコードも実行しようとしますが、画像がデザイナーのパスにないため、クラッシュします。現在のディレクトリが「Visual Studio」であるかどうかを確認するためにハックを入れてしまい、何もしませんでした...しかし、それはとても醜いです。

これは他のことでも起こっていると思います。コントロールが、プログラムの実行中にのみ使用できるオブジェクトをロード/初期化中に使用しようとしている場合、デザイン ビューはコントロールを表示できません。

しかし、これを回避する方法はありますか?

私が望んでいるのは、発生することがわかっているいくつかのエラー (FileNotFoundException など) を無視する機能を備えたデザイナー (のみ) の try/catch を持つことだと思います。

ありがとう

4

4 に答える 4

4

から継承するものはすべて、デザイン モードかどうかを示すブール値を返すプロパティをSystem.Windows.Forms.Control持っています。DesignModeこれを使用して、外部リソースをいつロードするか/ロードしないかを決定できます。

于 2009-02-03T20:34:18.420 に答える
1

これは、デザイナーに表示されたときの画像のサンプルを使用してコントロールライブラリを作成する場合や、他のデザイナー機能に接続する場合に使用する優れたパターンですが、開発のパターンとしては、非常に効果的かどうかはわかりません。

ツリービューコントロールの範囲外に「ビジネスロジック」(この場合は特定の画像をツリービューにロードする)をシフトすることをお勧めします。あなたの場合、コントロールが内部にあるフォームのLoadイベント内にロジックを配置します。

public void Load(object sender, EventArgs e)
{
    string path = "c:\somePath\toAwesome\Images";
    myFunkyTreeView.AddImages(path);
}

より大きなアプリの場合、私は個人的にロジックをフォーム自体からもシフトしたいと思いますが、これが提供する柔軟性とのトレードオフとして追加の配管が必要になるため、これは議論の余地のある手段です。

于 2009-02-03T21:32:43.450 に答える
1

通常、これらのリソースの読み込みを OnLoad のオーバーライドに移動することをお勧めします。これは、構築時に直接必要になることはめったにないためです。これにより、表示されている問題が修正され、少なくとも 1 回表示されるツリーのみがこれらの追加のリソース読み込み手順を実行するようになります。

DesignModeそれ以外の場合は、プロパティを確認して適切に対処することで、設計時にこれらの手順を除外できます。

于 2009-02-03T20:36:14.360 に答える
1

私を正しい方向に向けてくれてありがとう。

OnLoad イベントに登録しようとしましたが、そのイベントはデザイン ビューが表示されたときにトリガーされるため、うまくいきませんでした (何か間違っているのでしょうか?)。

とにかく、DesignMode プロパティをもう少し詳しく調べました。コントロールに対してのみ機能し、オブジェクトがコントロールではない場合もあります。

だからここに私が好む答えがあります:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) {
    // design-time stuff
} else {
    // run-time stuff
}

ここで見つけました。

于 2009-02-03T21:12:39.840 に答える