我构建了一个允许我将NotifyIcon
扩展为wpf的类,这个工作得很好但是我在显示BalloonTip
的方法上遇到了问题,让我解释一下上课工作:
public class TrayMinimize
{
private Window _window;
private NotifyIcon _notifyIcon;
private bool _balloonShown;
public TrayMinimize(Window window)
{
_window = window;
_window.StateChanged += new EventHandler(HandleStateChanged);
}
private void HandleStateChanged(object sender, EventArgs e)
{
if (_notifyIcon == null)
{
_notifyIcon = new NotifyIcon();
var icon = Properties.Resources.Favicon;
_notifyIcon.Icon = icon;
_notifyIcon.MouseClick += new MouseEventHandler(HandleNotifyIconOrBalloonClicked);
_notifyIcon.BalloonTipClicked += new EventHandler(HandleNotifyIconOrBalloonClicked);
}
_notifyIcon.Text = "Hello world";
var minimized = (_window.WindowState == WindowState.Minimized);
_window.ShowInTaskbar = !minimized;
_notifyIcon.Visible = minimized;
if (minimized && !_balloonShown)
{
_notifyIcon.ShowBalloonTip(1000, null, "Test", ToolTipIcon.None);
_balloonShown = true;
}
}
// Maximize the window on double click
private void HandleNotifyIconOrBalloonClicked(object sender, EventArgs e)
{
_window.WindowState = WindowState.Normal;
}
// Display a BalloonTip
public void DisplayBalloon(string title, string body = null)
{
_notifyIcon.ShowBalloonTip(1000, title, body, ToolTipIcon.None);
}
}
我有一个公共构造函数,允许我传递我需要处理notifyIcon的窗口实例。 HandleStateChanged
检查notifyIcon
是否已定价,如果没有,我会设置一个图标,以及MouseClick
和BallonTipClicked
的事件。
现在使用控件,我只是这样做:
private TrayMinimize iconTray;
public MainWindow()
{
InitializeComponent();
iconTray = new TrayMinimize(this);
}
private void Button1_Click(object sender, RoutedEventArgs e)
{
iconTray.DisplayBalloon("Test", "This is a test!");
}
现在的问题是,当调用方法DisplayBalloon
时,我得到了这个例外:
的NullReferenceException
似乎事实上iconTray
为空,如果我在Main上调用方法,这也会发生。我不明白为什么会发生这种情况,因为我使用的是已经创建并使用窗口实例设置的对象。我做错了什么?
答案 0 :(得分:2)
在这种方法中:
public void DisplayBalloon(string title, string body = null)
{
_notifyIcon.ShowBalloonTip(1000, title, body, ToolTipIcon.None);
}
您应该在调用ShowBalloonTip方法之前实例化_notifyIcon对象。
_notifyIcon = new NotifyIcon();
这就是例外的原因。
答案 1 :(得分:1)
我认为您的异常与_notifyIcon
类中的TrayMinimize
对象有关。
_notifyIcon
已在HandleStateChanged
中初始化,但仅在_window
引发StateChanged
事件时才会初始化。你有没有回答问题 - 如果这个事件从未被提出过怎么办?
顺便说一下。您可以使用iconTray
创建TrayMinimize
(类型为MinimizeToTray
)。这是错字还是你错过了什么?