アプリ全体でデフォルトのWinformアイコンを変更する
-
22-07-2019 - |
質問
Winformで使用されるデフォルトのアイコンを変更できますか?
ほとんどのフォームでは、アイコンプロパティがカスタムアイコンに設定されています。ひび割れをすり抜けるいくつかのフォームについては、「ちょっと見て、彼はこれをビジュアルスタジオで作った」という一般的なものは望ましくありません。アイコン。
1つの解決策は、すべてのフォームを面倒にチェックして、カスタムアイコンが設定されているか、ShowIconがFalseに設定されていることを確認することです。
別の解決策は、コンストラクターでカスタムアイコンを設定する基本クラスからすべてのフォームを継承させることです。
これらのソリューションとは別に、他にどのようなオプションがありますか?
編集: ストックアイコンのソースを自分のものに置き換える方法があると期待していました。それはどこかのリソースファイルにありますか?または、.NET dllに埋め込まれていて、変更できない(または実際には変更すべきでない)のですか?
バウンティ編集: 1行のコードを編集または記述せずにこれを達成する方法はありますか?ソリューションがどれほど非現実的で、複雑で、時間の無駄であるかは気にしません...それが可能かどうかを知りたいだけです。好奇心を満たす必要があります。
解決
default アイコンはwinforms dllに埋め込まれています-リフレクター( 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;
}
and
using(var frm = new MySpecificForm().CommonInit()) {
// ready to use
}
これは、既存のコードから離れた .CommonInit()
です。
他のヒント
基本クラスオプションは、使用するオプションです。
代替手段(必ずしも良いものとは限りません)を探している場合は、次のことができます。 1. IOCを使用してすべてのフォームをインスタンス化し、IOCコンテナを変更してアプリケーションアイコンを設定します。 2. AOPを使用して、アプリケーションアイコンを設定するすべてのフォームにコードを挿入します。
個人的には、基本クラスを使用するだけです...
役に立つ答え:
いいえ
ただし、ほとんどのアプリはアプリケーション全体で同じアイコンを使用するため、Microsoftが実装する優れた機能になります。
すべてのアイコンを別のアイコンで更新する場合、すべての* .Designer.vbファイル(vb.net内)を編集し、InitializeComponentに次の行を追加する小さなアプリを構築できます。
Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")
お役に立てば幸いです。
すべてのフォームが1つのプロジェクトにある場合、プロジェクトのdllを取得し、リフレクションを使用してdllのすべてのタイプを取得できます。タイプがフォームから派生している場合、タイプのIconプロパティを必要なものに設定できます。プロジェクトが非常に大きい場合、パフォーマンスのオーバーヘッドがどうなるかわかりません。