Почему я не могу заставить мой NotifyIcon, реализованный в другом классе, исчезнуть при выходе? - PullRequest
0 голосов
/ 05 декабря 2010

Вот некоторый код из только что созданного проекта Windows Forms, в котором ничего не изменилось:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Bitmap blah = new Bitmap(16, 16);
        using (Graphics blah2 = Graphics.FromImage(blah))
        {
            blah2.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, 0, 16, 16));
        }
        NotifyIcon2 n = new NotifyIcon2();
        n.NotifyIcon = new NotifyIcon();
        n.NotifyIcon.Icon = Icon.FromHandle(blah.GetHicon());
        n.NotifyIcon.Visible = true;
    }

    class NotifyIcon2 : IDisposable
    {
        public NotifyIcon NotifyIcon { get; set; }

        private bool disposed;

        ~NotifyIcon2()
        {
            Dispose(false);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this); // The finalise process no longer needs to be run for this
        }

        protected virtual void Dispose(bool disposeManagedResources)
        {
            if (!disposed)
            {
                try
                {
                    NotifyIcon.Dispose();
                }
                catch { }
                disposed = true;
            }
        }
    }
}

Из того, что я вижу, в protected virtual void Dispose, NotifyIcon уже был удален при получениивыполнено (объясняет, почему я поставил блок try / catch), поэтому я ничего не могу сделать с его значком.

Так как мне заставить его исчезнуть?

1 Ответ

1 голос
/ 05 декабря 2010

Оказывается, избавление от родительского класса уберет вместе с ним ребенка.

FormClosing += (sender, e) => n.Dispose();

(см. Ссылку, приведенную в комментарии BoltClock к вопросу)

...