我有一个使用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”的正确方法。
有人能指出我正确的方向吗?
答案 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属性将返回一个值,无论你的包含它的控件是否已被加载或甚至实例化。