Установить одинаковый значок для всех моих форм - PullRequest
27 голосов
/ 10 октября 2008

Есть ли способ установить один и тот же значок для всех моих форм, не меняя их по одному? Примерно так, когда вы настраиваете GlobalAssemblyInfo для всех ваших проектов внутри вашего решения.

Ответы [ 8 ]

45 голосов
/ 15 мая 2013
  1. В свойствах проекта> Приложение> Значок и манифест> найдите файл * .ico и добавьте его туда.

  2. В конструкторе или _Load событии формы просто добавьте:

    this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
    
24 голосов
/ 10 октября 2008

Одним из вариантов будет наследование от общей базовой формы, которая устанавливает Icon в конструкторе (предположительно, из resx). Другой вариант может быть PostSharp - кажется, что это можно сделать (установить .Icon) через AOP; не тривиально, хотя. Наконец, вы можете использовать простой служебный метод (возможно, метод расширения), чтобы сделать то же самое.

Лучше всего, при первом варианте вы, вероятно, могли бы рискнуть Ctrl + H (заменить все) с : Form или : System.Windows.Forms.Form до : MyCustomForm.

8 голосов
/ 10 октября 2008

В дополнение к рекомендации Марка вы можете захотеть, чтобы ваши формы автоматически наследовали значок выполняющейся сборки, которая содержит / вызывает их.
Это можно сделать, добавив следующий код в унаследованную форму:

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);
2 голосов
/ 01 июня 2015

Я не был уверен, хочу ли я использовать здесь наследование, поэтому я использовал метод расширения:

public static class MyExtensionMethods
{
    public static void SetAppIcon(this Form form)
    {
        form.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
    }
}

Тогда в конструкторе любой формы:

this.SetAppIcon();

Примечание: это вызовет сбой, если вы попытаетесь запустить приложение из сетевого расположения

1 голос
/ 06 марта 2017

Это способ установить одну и ту же иконку для всех форм без необходимости менять одну за другой. Это то, что я кодировал в своих приложениях.

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;
        }
    }
}
1 голос
/ 04 сентября 2011

Альтернативой настройке в конструкторе является переопределение свойства Owner и получение значка формы владельца.

public new Form Owner {
    set {
        this.Icon = (value == null ? null : value.Icon);
        base.Owner = value;
    }

    get {
        return base.Owner;
    }
}
0 голосов
/ 24 декабря 2018

Это старый вопрос, но этот метод помог мне получить один и тот же значок во всех формах, не добавляя его в свойства каждой формы.

Сначала я добавил новый значок в узле «Ресурсы» в разделе «Свойства» (добавить ресурс => Новый значок).

По умолчанию какой-то значок создается и сохраняется в вашем расположении ресурсов (найдите свойство «Имя файла» на значке).

Если у вас есть готовый файл .ico, вы можете скопировать его в эту папку.

Удалите одну Visual Studio, созданную в этой папке, и переименуйте вашу собственную в точно такое же имя.

Visual Studio предложит вам перезагрузить ресурс с момента его изменения. (нажмите «Да»)

Таким образом, ваш логотип будет доступен в разделе ресурсов.

Теперь я сделал общий метод, чтобы изменить заголовок формы на мой по умолчанию, установить значок формы и вызвать его в каждой форме сразу после InitializeComponent ();

Как это выглядит в форме cs (m - это класс, содержащий общий метод):

m.set_form_defaults(this, "Title here");

И это сам метод:

    public void set_form_defaults(Form frm,string frmTitle)
    {

        frm.Icon = ((System.Drawing.Icon)(Properties.Resources.Logo_V2));
        frm.Text = frmTitle + " " + show_current_server();

    }

Конечно, вам не нужно добавлять здесь заголовок формы, но это только потому, что я хочу показать некоторые сохраненные свойства пользователю (текущему серверу)

0 голосов
/ 14 октября 2008

Я не уверен, что разработчик MS VS может работать с формами, которые не являются производными непосредственно от формы. Если нет, то вы можете попробовать скопировать значок основной формы во все остальные формы: за каждую форму в коллекции Forms

form.icon = MainFrom.Icon

Или, возможно, в событии _Loaded каждой формы:

Icon = MainFrom.Icon
...