【问题标题】:Same icon for all windows forms [duplicate]所有Windows窗体的相同图标[重复]
【发布时间】:2021-10-19 17:05:37
【问题描述】:

我正在做一个项目,我的要求是我必须在所有 Windows 窗体上使用相同的图标。我有至少 50 个窗体,还有更多需要添加。那么有没有办法为所有窗体设置默认图标而不是在每个窗体页面上手动设置。

【问题讨论】:

  • 那个链接它提供了从可执行文件设置图标的代码,但我还没有为我的可执行文件设置任何图标
  • @StephanBauer 这是一个带有旧答案的老问题,其中一些不再有用。
  • 检查这个:link。添加在您的 Program Main 方法中。
  • @ShaifaliGoel 好吧,你的图标来自哪里并不重要。接受的答案描述了如何为所有表单设置相同图标的多种可能性。
  • @Corey 我将其改写为“这是一个带有旧答案的老问题,其中一些仍然有用。” ;-)

标签: c# winforms


【解决方案1】:

对于这个问题,您有多种解决方案 最好的想法是从在构造函数中设置 Icon 的通用基本表单继承。 从:Form 或:System.Windows.Forms.Form 到:MyCustomForm

然后只需在 MyCustomForm Cunstrunctor 中写入这一行来更改 MyCustomForm 图标

this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);

然后您只需从项目属性 > 应用程序 > 图标和清单 > 浏览 *.ico 文件并将其添加到那里即可更改项目图标。 这种方法可以更改其他属性,例如字体、大小、锚点、...

如果您有多种形式,例如:

public class MyAppForm1 : Form {
   ...
}

然后,不是从Form 派生,而是创建一个中间MyIconForm

public class MyIconForm : Form {
  public MyIconForm() : base() {
    this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
  }
}

然后您只需将所有表单更新为:

public class MyAppForm1 : MyIconForm {
   ...
}

【讨论】:

【解决方案2】:

简短的回答是否定的,没有可以设置项目中所有表单使用的图标的中心位置。你必须自己做。您可以使用多种方法,包括在程序初始化期间使用反射为Form.DefaultIcon 设置支持字段。

第一步:获取图标。

这里有几个选项。您可以从文件、资源或嵌入式资源(是的,两种不同类型的资源)加载图标。或者应用程序图标,但你说你没有。

对于标准资源:

  • 打开项目属性
  • 点击Add ResourceAdd Existing File 并浏览到您的图标。
  • 图标被添加到Properties.Resources,并带有一个以文件命名的属性。

对于内容文件(随应用程序分发):

  • 将图标文件添加到项目(添加现有项)
  • 将文件的Build Action 属性设置为Content
  • 将文件的Copy to Output Directory 设置为Copy AlwaysCopy if newer
  • 使用new Icon(iconFilename)加载图标。

对于嵌入式资源:

  • 将图标文件添加到项目(添加现有项)
  • 将文件的Build Action 设置为Embedded Resource
  • 使用Assembly.CurrentAssembly.GetManifestResourceStream 将资源作为流打开。

在这三个中,我会为大多数事情选择标准资源。

使其工作 1:表单构造函数

将适当的加载代码添加到每个表单的构造函数中:

public partial class Form1 : Form
{
    public Form1()
    {
        // Using standard resource method
        Icon = Properties.Resources.FormIcon;
        InitializeComponent();
    }
}

使其工作 2:基类

这是一个相当简单的选项,假设您可以控制所有表单的源并且可以通过所有表单来更改它们的基类。基类只是在构造过程中设置表单的图标:

public class DefaultIconForm : Form
{
    // Using content file method
    private static readonly Icon _defaultIcon = new Icon("FormIcon.ico");

    public DefaultIconForm()
    {
        Icon = _defaultIcon;
    }
}

public partial class Form1 : DefaultIconForm
{
    public Form1()
    {
        InitializeComponent();
    }
}

您需要更改所有表单,并记住从DefaultIconForm 继承所有未来的表单。

使其工作3:修改Form.DefaultIcon

这是一个有点讨厌的技巧,它依赖于反射并且可能在某些时候失败,但这意味着不必更改应用程序中的任何其他代码。

打开您的Program.cs 文件并将此方法添加到Program 类:

    private static void SetDefaultFormIcon()
    {
        var field = typeof(Form).GetField("defaultIcon", BindingFlags.Static | BindingFlags.NonPublic);
        
        // And for completeness, this is the Embedded Resource method
        using (var stream = typeof(Program).Assembly.GetManifestResourceStream($"{Application.ProductName}.FormIcon.ico"))
        {
            var ico = new Icon(stream);
            field?.SetValue(null, ico);
        }
    }

现在从main() 调用SetDefaultFormIcon() 进行初始化。

正如所写,它适用于 .NET Framework 和 .NET 5 WinForms 应用程序。无法保证 defaultIcon 隐藏的静态字段将来不会更改,因此请准备好在某个时候它会中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    相关资源
    最近更新 更多