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

本文关键字:wpf 任何 访问 创建 ballontip 一个 | 更新日期: 2023-09-27 18:16:42

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

我正在尝试添加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"的正确方法。

谁能给我指个正确的方向?

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

我以前从未见过NotifyIcon(顺便说一下,有点酷),但我看了看它的API。我的建议是,您不要费心命名该控件并试图在代码中找到它。相反,在您的主导航窗口中,将其数据上下文设置为您定义的helper类,并绑定到其iconsource、tooltiptext等:

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

(这里有更多关于值转换器的信息)。

现在,"SomeViewModel"类将实现INotifyPropertyChanged并公开如下属性:

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

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

使用这种方法,您不需要告诉您的表示层去查看您的视图层,这不是真正理想的。如果视图(XAML)知道表示(代码),那就更好了,反之则不行,因为这会使耦合变得松散。在这种情况下,由于您的实际代码不依赖于XAML中声明的某些命名控件的存在,因此它放松了耦合。

如何在这个辅助视图模型,您可以通过它的各种类的引用可以设置它,或者你可以有副导航窗口的提高导航窗口监听的事件,也可以用这种方法,你所想要的,这是定义一个静态方法视图模型(我不提倡这种方法,就我个人而言,但它是最接近你想做什么)。

如果你设置了你在这里采取的方法,但是,请记住,你已经在那个控件中命名了它,所以你可以将它作为一个静态属性重新公开在有问题的控件上:

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静态属性为空之前做任何事情,并记住,静态属性将工作返回一个值,无论你的控件包含它已经加载或甚至实例化。