2011-12-04 2 views
0

私はMasterWindow内のページを読み込むことができるNavigationWindowを使用しているwpfアプリケーションを持っています。任意のwpfページからアクセスできるballontipのヘルパークラスを作成する

通知機能をhttp://www.codeproject.com/KB/WPF/wpf_notifyicon.aspxに追加しようとしていますが、通知ウィンドウを表示することができます。

私が読み込まれたページのいずれかからMyNotifyIconにアクセスすることができますヘルパークラスを作成することができるようにしたい私のnavigationwindow

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

にtaskbaritemを追加しました。私は私のヘルパークラスからコントローラ「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); 

    } 

のようなものを考えていました。

誰かが正しい方向に向かうことができますか?

+0

名前付きGUIコントロールを直接操作するプレゼンテーションレイヤーコードでヘルパークラスを使用したいのはなぜですか?そのtb.ShowCustomBalloon()はあなたの機能を達成するための唯一のAPIですか、それともXAMLを通して行うことができますか? –

+0

理想的にはすべてのコードを通して。私は新しいタバコを作成した場合、私はそれを閉じることができませんでした私のバルーンを表示した後に私が必要なたびに発見した。 私はこのようなヘルパーを呼び出すことができることを望んでいました。
Notification.DisplayMessageArea(string.Format( "Welcome back {0}"、CustomerName)); –

答えて

0

以前はNotifyIconを見たことがありませんでしたが(ちょっと涼しいですが)、私はそのAPIを見ました。私が示唆していることは、あなたがそのコントロールの名前をつけて、あなたのコード内で見つけようとするのを気にしないことです。 (値コンバータhereの詳細)

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

:代わりに、あなたのメインのナビゲーションウィンドウで、そのiconsource、TOOLTIPTEXTなどにそのユーザーが定義したヘルパークラスへのDataContext、およびバインドを設定します。

は今、「SomeViewModel」クラスはINotifyPropertyChangedのを実装し、のようなプロパティを公開します。これらのプロパティは、実際のゲッター/セッターを持っているし、プロパティ変更イベントが発生しますことを除いて...

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

このアプローチでは、プレゼンテーションレイヤーにViewレイヤーを表示するように指示する必要はありませんが、これは実際には理想的ではありません。ビュー(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静的プロパティで何かを行う前にnullをチェックし、静的プロパティが機能するかどうかにかかわらず、コントロールを含むコントロールがロードされているかインスタンス化されているかどうかにかかわらず、

関連する問題