Есть ли способ установить один и тот же значок для всех моих форм, не меняя один за другим?
Что-то вроде при настройке GlobalAssemblyInfo
для всех ваших проектов внутри вашего решения.
Установите одинаковый значок для всех моих форм
Ответ 1
Один из вариантов заключается в наследовании от общей базы-формы, которая устанавливает значок в конструкторе (предположительно из resx). Другим вариантом может быть PostSharp - похоже, что это должно быть возможно (установить .Icon) через AOP; не тривиально. Наконец, вы можете использовать простой метод утилиты (возможно, метод расширения), чтобы сделать то же самое.
Лучше всего, с первым вариантом вы могли бы рискнуть Ctrl + H (заменить все) с : Form
или : System.Windows.Forms.Form
на : MyCustomForm
.
Ответ 2
-
В свойствах проектa > Приложение > Значок и манифест > найдите файл *.ico и добавьте его там.
-
В конструкторе или
_Load
событии формы просто добавьте:this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
Ответ 3
В дополнение к рекомендации Marc вы можете захотеть, чтобы ваши формы автоматически наследовали значок исполняющей сборки, которая содержит/вызывает их.
Это можно сделать, добавив следующий код в унаследованную форму:
public MyCustomForm()
{
Icon = GetExecutableIcon();
}
public Icon GetExecutableIcon()
{
IntPtr large;
IntPtr small;
ExtractIconEx(Application.ExecutablePath, 0, out large, out small, 1);
return Icon.FromHandle(small);
}
[DllImport("Shell32")]
public static extern int ExtractIconEx(
string sFile,
int iIndex,
out IntPtr piLargeVersion,
out IntPtr piSmallVersion,
int amountIcons);
Ответ 4
Я не был уверен, хотел ли я использовать наследование здесь, поэтому использовал метод расширения:
public static class MyExtensionMethods
{
public static void SetAppIcon(this Form form)
{
form.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
}
}
Тогда в любом виде конструктор:
this.SetAppIcon();
Примечание: это приведет к сбою при попытке запустить приложение из сетевого расположения.
Ответ 5
Альтернатива установке в конструкторе переопределяет свойство Owner
и принимает значок формы владельца.
public new Form Owner {
set {
this.Icon = (value == null ? null : value.Icon);
base.Owner = value;
}
get {
return base.Owner;
}
}
Ответ 6
Это способ установить один и тот же значок для всех форм, не меняя один за другим. Это то, что я закодировал в своих приложениях.
FormUtils.SetDefaultIcon();
Вот полный пример, готовый к использованию.
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Here it is.
FormUtils.SetDefaultIcon();
Application.Run(new Form());
}
}
Вот класс FormUtils:
using System.Drawing;
public static class FormUtils
{
public static void SetDefaultIcon()
{
var icon = Icon.ExtractAssociatedIcon(EntryAssemblyInfo.ExecutablePath);
typeof(Form)
.GetField("defaultIcon", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)
.SetValue(null, icon);
}
}
И вот класс EntryAssemblyInfo. Это усечено для этого примера. Это мой собственный кодированный класс, взятый из System.Winforms.Application.
using System.Security;
using System.Security.Permissions;
using System.Reflection;
using System.Diagnostics;
public static class EntryAssemblyInfo
{
private static string _executablePath;
public static string ExecutablePath
{
get
{
if (_executablePath == null)
{
PermissionSet permissionSets = new PermissionSet(PermissionState.None);
permissionSets.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
permissionSets.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode));
permissionSets.Assert();
string uriString = null;
var entryAssembly = Assembly.GetEntryAssembly();
if (entryAssembly == null)
uriString = Process.GetCurrentProcess().MainModule.FileName;
else
uriString = entryAssembly.CodeBase;
PermissionSet.RevertAssert();
if (string.IsNullOrWhiteSpace(uriString))
throw new Exception("Can not Get EntryAssembly or Process MainModule FileName");
else
{
var uri = new Uri(uriString);
if (uri.IsFile)
_executablePath = string.Concat(uri.LocalPath, Uri.UnescapeDataString(uri.Fragment));
else
_executablePath = uri.ToString();
}
}
return _executablePath;
}
}
}
Ответ 7
Я не уверен, что дизайнер MS VS может иметь дело с Forms, которые не производятся непосредственно из Form. Если нет, вы можете попытаться скопировать значок основной формы во все остальные формы: для каждой формы в коллекции форм
form.icon = MainFrom.Icon
Или, возможно, в каждой форме _Loaded event:
Icon = MainFrom.Icon