Не обновляете systray notifyicon динамически? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть следующий код, который «должен» нарисовать 2 на существующий трейник, но при запуске значок не обновляется?я сохранил растровое изображение в файл, и он имеет 2 отрисовки сверху, как и ожидалось, мне нужно как-нибудь обновить иконку в трее, чтобы она обновилась, или я иду по этому пути неправильно

t_Elapsed:

Graphics canvas;
Bitmap iconBitmap = new Bitmap(16, 16);
canvas = Graphics.FromImage(iconBitmap);

canvas.DrawIcon(Properties.Resources.SystemTrayApp, 0, 0);

StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;

canvas.DrawString(
    "2",
    new Font("Calibri", 8, FontStyle.Bold),
    new SolidBrush(Color.FromArgb(40, 40, 40)),
    new RectangleF(0, 3, 16, 13),
    format
);

NotifyIcon ni;
ni = new NotifyIcon();
ni.Icon = Icon.FromHandle(iconBitmap.GetHicon());
ni.Visible = true;

t.Start();

вот код, где изначально генерируется notifyicon ...

namespace SystemTrayApp
{
class ProcessIcon : IDisposable
{
    NotifyIcon ni;

    public ProcessIcon()
    {
        ni = new NotifyIcon();
    }

    public void Display()
    {   
        ni.MouseClick += new MouseEventHandler(ni_MouseClick);
        ni.Icon = Resources.SystemTrayApp;
        ni.Text = "Auto Sort";
        ni.Visible = true;

        ni.ContextMenuStrip = new ContextMenus().Create();
    }

    public void Dispose()
    {
        ni.Dispose();
    }
}
}

вот основная часть, где, как кажется, вызывается исходный ProcessIcon.

static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        // Show the system tray icon.                   
        using (ProcessIcon pi = new ProcessIcon())
        {
            pi.Display();

            t = new System.Timers.Timer();
            t.AutoReset = false;
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
            t.Interval = 2000;
            t.Start();

            // Make sure the application runs!
            Application.Run();               
        }
    }

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

как таймер может получить доступ к объекту pi для обновления иконки?

Спасибо

1 Ответ

0 голосов
/ 11 июня 2018

Нашел ответ, мне нужно переместить функции таймера в тот же класс, который создал иконку в трее, затем оттуда я запускаю таймер и могу обновить иконку, как и ожидалось.Также добавил распоряжение как предложено:)

Спасибо

...