You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#程序中如何在事件方法内访问上层ProcessingIcon对象修改托盘图标

解决方法:通过构造函数传递ProcessingIcon实例

你的核心问题是ContextMenus类没有持有上层ProcessingIcon对象的引用,所以在点击事件里无法调用它的SetIcon方法。最简单的解决方式是在创建ContextMenus时把当前的ProcessingIcon实例传进去,具体修改如下:

1. 修改ContextMenus.cs

添加私有字段保存ProcessingIcon实例,修改构造函数接收该实例,然后在点击事件里直接调用SetIcon:

// 添加私有字段存储ProcessingIcon实例
private ProcessingIcon _processingIcon;

// 新增构造函数,接收ProcessingIcon参数
public ContextMenus(ProcessingIcon processingIcon)
{
    _processingIcon = processingIcon;
}

public ContextMenuStrip Create()
{
    ContextMenuStrip cms = new ContextMenuStrip();
    ToolStripMenuItem item;

    // Sync Now
    item = new ToolStripMenuItem();
    item.Text = "Sync Now";
    item.Click += new EventHandler(syncNow_Click);
    item.Image = Resources.Sync.ToBitmap();
    cms.Items.Add(item);

    return cms;
}

void syncNow_Click(object sender, EventArgs e)
{
    // 同步开始时切换图标(假设你有同步中的图标资源SyncInProgress)
    _processingIcon.SetIcon(Resources.SyncInProgress);

    try
    {
        string[] jobs = Sync.GetSharedFiles();
        string[] files = Sync.GetDataToSync(jobs);
        Sync.SyncData(files);
    }
    finally
    {
        // 不管同步成功/失败,都切回原图标
        _processingIcon.SetIcon(Resources._12d);
    }
}

2. 修改ProcessingIcon.cs

创建ContextMenus时把当前实例传进去,同时记得初始化NotifyIcon字段(你原来的代码里没初始化,会触发空引用报错):

NotifyIcon ni;

// 新增构造函数初始化NotifyIcon
public ProcessingIcon()
{
    ni = new NotifyIcon();
}

public void SetIcon(Icon icon)
{
    ni.Icon = icon;
}

public void Display()
{
    ni.Text = "Sunrise Surveying 12d Synergy Sync Tool";
    ni.Visible = true;

    // 把当前ProcessingIcon实例传给ContextMenus
    ni.ContextMenuStrip = new ContextMenus(this).Create();
}

3. 补充说明

  • 确保你已经添加了同步状态的图标资源(比如SyncInProgress),如果没有可以先暂时用现有图标测试逻辑
  • try-finally块能保证即使同步过程中出错,图标也能恢复原状,避免一直显示同步中的状态

内容的提问来源于stack exchange,提问作者AlexCook0508

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:10:35