13

Winform で使用されるデフォルトのアイコンを変更できますか?

ほとんどのフォームでは、アイコン プロパティがカスタム アイコンに設定されています。ひび割れをすり抜けるいくつかのフォームについては、一般的な「ほら、彼はビジュアルスタジオでこれを作った」アイコンは必要ありません。

1 つの解決策は、すべてのフォームを面倒にチェックして、カスタム アイコンが設定されているか、ShowIcon が False に設定されていることを確認することです。

別の解決策は、コンストラクターでカスタム アイコンを設定する基本クラスからすべてのフォームを継承させることです。

これらのソリューション以外に、他にどのようなオプションがありますか?

編集: ストックアイコンのソースを自分のものに置き換える方法があることを望んでいました。リソースファイルのどこかにありますか?それとも、私が変更できない (または実際には変更すべきではない) .NET dll に埋め込まれていますか?

BOUNTY EDIT: コードを 1 行も編集または記述せずにこれを達成する方法はありますか? 解決策がどれほど非現実的で、複雑で、時間の無駄であるかは気にしません...それが可能かどうか知りたいだけです。好奇心を満たす必要があります。

4

5 に答える 5

24

デフォルトのアイコンはwinformsdllに埋め込まれています-リフレクター(DefaultIcon)を見ると次のようになります。

defaultIcon = new Icon(typeof(Form), "wfc.ico");

別の一般的な場所をチェックする魔法はそこにはないので、コードを変更せずにそれを行うことはできません。

あなたはいつでもフィールドベースの反射で闇の力を受け入れることができますか?注:これはハッキーで壊れやすいです。自分の頭で!しかし、それは機能します:

[STAThread]
static void Main() {
    // pure evil
    typeof(Form).GetField("defaultIcon",
            BindingFlags.NonPublic | BindingFlags.Static)
        .SetValue(null, SystemIcons.Shield);

    // all forms now default to a shield
    using (Form form = new Form()) {
        Application.Run(form);
    }
}

それを正しく行うために; 2つの一般的なオプション。

  • アイコンが設定されている基本Formクラス
  • ファクトリFormメソッド-おそらく次のようなものです:

コード:

public static T CreateForm<T>() where T : Form, new() {
    T frm = new T();
    frm.Icon = ...
    // any other common code
    return frm;
}

次に、代わりに:

using(var frm = new MySpecificForm()) {
    // common init code
}

何かのようなもの:

using(var frm = Utils.CreateForm<MySpecificForm>()) {

}

もちろん、それはそれほどきれいではありません!別のオプションは、おそらく流暢なAPIとしてのC#3.0拡張メソッドである可能性があります。

public static T CommonInit<T>(this T form) where T : Form {
    if(form != null) {
        form.Icon = ...
        //etc
    }
    return form;
}

using(var frm = new MySpecificForm().CommonInit()) {
    // ready to use
}

これは.CommonInit()、既存のコードから少し離れています。

于 2009-10-02T06:49:42.850 に答える
4

基本クラス オプションは、使用するものです。

代替手段 (必ずしも良いものとは限りません) を探している場合は、次のことができます。 1. IOC を使用してすべてのフォームをインスタンス化し、IOC コンテナーを変更してアプリケーション アイコンを設定します。2. AOP を使用して、アプリケーション アイコンを設定するコードをすべてのフォームに挿入します。

個人的には、基本クラスを使用するだけです...

于 2009-08-05T14:53:00.383 に答える
2

私の役に立つ答え:

いいえ

ただし、ほとんどのアプリはアプリケーション全体で同じアイコンを使用するため、Microsoftが実装するのに適した機能になります。

于 2009-10-01T20:15:02.130 に答える
1

すべてのアイコンを別のアイコンで更新する場合は、すべての *.Designer.vb ファイル (vb.net 内) を編集し、次の行を InitializeComponent に追加する小さなアプリを作成できます。

Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")

それが役に立てば幸い。

于 2009-08-07T22:01:40.680 に答える
0

すべてのフォームが 1 つのプロジェクト内にある場合は、プロジェクトの dll を取得し、リフレクションを使用して dll 内のすべてのタイプを取得できます。型が Form から派生する場合、型の Icon プロパティを任意の値に設定できます。プロジェクトが非常に大きい場合、パフォーマンスのオーバーヘッドがどの程度になるかはわかりません。

于 2009-08-05T14:54:08.340 に答える