为ballontip创建一个可以从任何wpf页面访问的辅助类

时间:2011-12-04 21:13:44

标签: c# wpf

我有一个使用NavigationWindow的wpf应用程序,它允许我在MasterWindow中加载页面。

我正在尝试将notifyicon功能http://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx添加到我的应用程序中,这样我就可以在需要时显示通知窗口。

我已将任务栏添加到导航窗口

 <tb:TaskbarIcon x:Name="MyNotifyIcon" ToolTipText="My Application" IconSource="/Images/Icons/TB.ico"/>

我希望能够创建一个可以从任何加载的页面访问MyNotifyIcon的辅助类。我在想像

  public static void DisplayMessageArea(string messageToDisplay)
    {
        var balloon = new StandardNotification {BalloonMessage = messageToDisplay };

        //TaskbarIcon tb = (TaskbarIcon)MasterWindow.Resources.FindName("MyNotifyIcon");
        //tb.ShowCustomBalloon(balloon,PopupAnimation.Slide,4000);

    }

但是我不知道从帮助程序类中找到控制器“MyNotifyIcon”的正确方法。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

我之前从未见过NotifyIcon(顺便说一句,很酷),但我看了一下它的API。我建议你不要在命名控件并试图在代码中找到它。相反,在主导航窗口中,将其datacontext设置为您定义的辅助类,并绑定到其iconsource,tooltiptext等:

<tb:TaskbarIcon DataContext="{Binding SomeViewModel}"
  IconSource="..."
  ToolTipText="{Binding Text}"
  Visibility="{Binding IsVisible, Converter=...}" />

(有关价值转化器的更多信息here)。

现在,“SomeViewModel”类将实现INotifyPropertyChanged并公开以下属性:

bool IsVisible { get; set; }
string Text { get; set; }

...除了这些属性将具有实际的getter / setter并引发属性更改事件。

使用这种方法,您无需告诉您的表示层在View层中查看,这不是很理想。最好是你的视图(XAML)知道你的演示文稿(代码),但反之亦然,因为这会松开耦合。在这种情况下,它会因为你的实际代码不依赖于在XAML中声明的某个命名控件的存在而放松耦合。

至于如何获得这个辅助视图模型,你可以将它的引用传递给可以设置它的各个类,或者你可以让导航窗口的子控件引发导航窗口监听的事件for,或者你可以采用你想到的方法,即在视图模型上定义一个静态方法(我个人并不是这种方法的拥护者,但它最接近你所期待的做)。

但是,如果您已设置了此处所采用的方法,请记住您确实已在该控件中命名,因此您可以将其作为相关控件的静态属性重新公开:

class MyControlWithTipIcon
{
    public static TaskbarIcon TaskBarIcon { get { return MyNotifyIcon; } }

}

现在,您可以从助手类访问它:

public static void DisplayMessageArea(string messageToDisplay)
{
    MyControlWithTipIcon.TaskBarIcon.ToolTipText = messageToDisplay;
    MyControlWithTipIcon.TaskBarIcon.Visibility = ... //i.e. show the message
}

我根本不会个人提倡这种方法,但这可能是最简单的方法,特别是你所要求的。但是,如果你走这条路线,记得在对它做任何事情之前检查TaskBarIcon静态属性为null,并记住static属性将返回一个值,无论你的包含它的控件是否已被加载或甚至实例化。