あまり明白ではない解決策を見つけましたが、間違いなく MVVM パターンの方が適しています。これにより、TaskbarIcon を XAML で作成し、ViewModel によって新しいバルーン データを供給することができます。
最初に行うことは、TaskbarIcon にバブルを表示させたいことを通知する何らかの機能を追加することです。この目的のために Microsoft の Rx 拡張機能 (NuGet Package Rx-Main) を使用することにしましたが、適切なインフラストラクチャであればどれでも機能します。これは新しい TaskbarIcon クラスで、ShowBubbleTip メソッドが呼び出されたときに渡すデータを保持するためのクラスです。
using Hardcodet.Wpf.TaskbarNotification;
using System;
using System.Windows;
namespace Phi.Utility
{
public class TaskbarIconRxBallonNotification
{
public Hardcodet.Wpf.TaskbarNotification.BalloonIcon Icon
{
get;
private set;
}
public string BallonTitle
{
get;
private set;
}
public string Message
{
get;
private set;
}
public TaskbarIconRxBallonNotification(Hardcodet.Wpf.TaskbarNotification.BalloonIcon icon, string balloonTitle, string message)
{
Icon = icon;
BallonTitle = balloonTitle;
Message = message;
}
}
public class TaskbarIconRx : TaskbarIcon
{
public IObservable<TaskbarIconRxBallonNotification> BalloonTipNotifier
{
get { return (IObservable<TaskbarIconRxBallonNotification>)GetValue(BallonTipNotifierProperty); }
set { SetValue(BallonTipNotifierProperty, value); }
}
// Using a DependencyProperty as the backing store for BalloonSubject. This enables animation, styling, binding, etc...
public static readonly DependencyProperty BallonTipNotifierProperty =
DependencyProperty.Register("BalloonTipNotifier", typeof(IObservable<TaskbarIconRxBallonNotification>), typeof(TaskbarIconRx), new PropertyMetadata(null, BallonTipNotifierChanged));
//What to do when we get a new ballonIcon request
protected void OnNextNotification(TaskbarIconRxBallonNotification notification)
{
ShowBalloonTip("", notification.Message, BalloonIcon.Info);
}
private IDisposable _subscription;
//Make sure swapping out bindings doesn't break our program.
public static void BallonTipNotifierChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TaskbarIconRx currentNotifier = d as TaskbarIconRx;
if (currentNotifier != null)
{
IObservable<TaskbarIconRxBallonNotification> prev = e.OldValue as IObservable<TaskbarIconRxBallonNotification>;
IObservable<TaskbarIconRxBallonNotification> next = e.NewValue as IObservable<TaskbarIconRxBallonNotification>;
if (currentNotifier._subscription != null)
{
currentNotifier._subscription.Dispose();
currentNotifier._subscription = null;
}
if ((next != null))
{
currentNotifier._subscription = next.Subscribe(currentNotifier.OnNextNotification);
}
}
}
}
}
モデルでは、バインドする ISubject を提供します
using System.Reactive.Subjects;
namespace Phi.Models {
public class SomeModel:ModelBase {
public ISubject<Utility.TaskbarIconRxBallonNotification> NotifierInterface
{
get;
private set;
}
public SomeModel() {
NotifierInterface = new Subject<Utility.TaskbarIconRxBallonNotification>();
}
}
}
ViewModel では、次のように、モデル サブジェクトを通じて通知をプッシュできるようになりました。
namespace Phi.ViewModels{
public class SomeViewModel:ViewModelBase
{
public SomeModel Model{
get;
private set;
}
public void PushNotification(string message)
{
//Pushes a new notification to the TaskbarIcon.
Model.NotifierInterface.OnNext(new Utility.TaskbarIconRxBallonNotification(Hardcodet.Wpf.TaskbarNotification.BalloonIcon.Info, "Title", message));
}
}
}
XAML では、モデル ISubject にバインドします。
<Utility:TaskbarIconRx Visibility= IconSource="/Resources/TinyLogo.ico" BalloonTipNotifier="{Binding Model.NotifierInterface}" >