【问题标题】:Changing System Tray Icon Image更改系统托盘图标图像
【发布时间】:2015-10-13 14:28:06
【问题描述】:

我在 .Net 中构建了一个工作正常的托盘应用程序。但是,用户希望在某些条件下在运行时更改托盘图标图像。为了简单起见,让我们说,有些东西不工作 - 托盘图标应该显示红色图像;如果一切正常,它应该显示为绿色。我不确定如何在.Net 中实现这一点。

请就此提供一些意见。谢谢

我为托盘构建了 CustomApplicationContent。下面是一些sn-ps:

程序.cs

[STAThread]
    static void Main()
    {
        if (!SingleInstance.Start()) { return; }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        try
        {
            var applicationContext = new CustomApplicationContext();
            Application.Run(applicationContext);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Program Terminated Unexpectedly",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        SingleInstance.Stop();
    }

CustomApplicationContext.cs

public class CustomApplicationContext : ApplicationContext
{
    private System.ComponentModel.IContainer components;    // a list of components to dispose when the context is disposed
    private NotifyIcon notifyIcon;
    private static readonly string IconFileName = "green.ico";
    private static readonly string DefaultTooltip = "Employee Management System";
    private readonly TrayManager trayManager;

    public CustomApplicationContext()
    {
        InitializeContext();
        trayManager = new TrayManager(notifyIcon);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && components != null) { components.Dispose(); }
    }


    private void InitializeContext()
    {
        components = new System.ComponentModel.Container();
        notifyIcon = new NotifyIcon(components)
        {
            ContextMenuStrip = new ContextMenuStrip(),
            Icon = new Icon(IconFileName),
            Text = DefaultTooltip,
            Visible = true
        };
        notifyIcon.ContextMenuStrip.Opening += ContextMenuStrip_Opening;
        notifyIcon.DoubleClick += notifyIcon_DoubleClick;
        //notifyIcon.MouseUp += notifyIcon_MouseUp;
    }
private void notifyIcon_DoubleClick(object sender, EventArgs e)
    {
        ShowAboutForm();
    }
private TestForm testForm;

    private void ShowAboutForm()
    {
        if (testForm == null)
        {
            testForm = new TestForm { trayManager = trayManager };
            testForm.Closed += testForm_Closed; ; // avoid reshowing a disposed form
            testForm.Show();
        }
        else { testForm.Activate(); }
    }


    void testForm_Closed(object sender, EventArgs e)
    {
        testForm = null;
    }

在哪里添加计时器 - 在上下文中?用户可能不会打开表单,因此在表单上添加计时器可能不会一直有效。如何更改图标?

【问题讨论】:

  • 只需更改图标属性,再简单不过了。

标签: c# .net winforms system-tray trayicon


【解决方案1】:

您可以在项目的 Resource.resx 文件 Red.ico 和 Green.ico 中添加 2 个图标,并在不同情况下以这种方式使用它们:

this.notifyIcon1.Icon = Properties.Resources.Red;

this.notifyIcon1.Icon = Properties.Resources.Green;

要将图标添加到Resourse.resx,请从项目的Properties 文件夹中打开Resources.resx。然后从设计器工具栏的第一个下拉列表中选择Icons,然后从下一个下拉列表中选择Add Existing File... 并添加您的图标文件。您也可以在此处重命名项目。

【讨论】:

    【解决方案2】:

    我会让您的图标嵌入资源,然后使用这样的代码在运行时更改当前显示的图标:

    notifyIcon.Icon = new Icon(this.GetType(), "red.ico");
    

    【讨论】:

    • 虽然您的解决方案完全没问题,但我认为使用Resource.resx 更友好:) +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多