无法存储窗口的实例

时间:2016-05-11 16:40:53

标签: c# wpf

我构建了一个允许我将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是否已定价,如果没有,我会设置一个图标,以及MouseClickBallonTipClicked的事件。

现在使用控件,我只是这样做:

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上调用方法,这也会发生。我不明白为什么会发生这种情况,因为我使用的是已经创建并使用窗口实例设置的对象。我做错了什么?

2 个答案:

答案 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)。这是错字还是你错过了什么?