トレイアイコンしかないWPFアプリケーション


144

私はWPFの初心者で、トレイに最小化された状態で起動するアプリケーションの記述方法を誰かに教えてもらえないかと思います。アイデアは、RSSフィードを定期的にフェッチし、新しいフィードがあるときにトースターポップアップを作成するというものです。

アプリケーションにはメインウィンドウ(基本的にはすべてのフィードエントリを含むリストのみ)が必要ですが、デフォルトでは非表示になっています。

XAMLとWPFについて読み始めましたが、App.xamlのStartupUriがメインウィンドウをポイントする必要があることを知っていますが、SysTrayアイコンを実行してメインウィンドウを非表示にする適切な方法(これもつまり、ユーザーがウィンドウを最小化すると、タスクバーではなくトレイに最小化されます)。

ヒントはありますか?


3
すべての提案をありがとう!簡単なテストで、WPF-NotifyIconは非常に有望で痛みがないことを示しています。
Michael Stum

回答:


114

WPFにはNotifyIconはありません。

私の同僚は、この無料で利用できるライブラリを効果的に使用しました。


2
素晴らしいライブラリ。それを利用するのを待つことができません!
Rob Hay

2
ドリュー、リンクはここで死んでしまったようです。このライブラリの代替リンクはありますか?簡単に検索しましたが、同じプロジェクトの結果かどうか判断できませんでした。
ブラッド・ラーソン

@BradLarson、サイトがダウンしているようです。とにかく、プロジェクトはNugetパッケージとして利用できます(Daleの回答を参照)
Thomas Levesque

4
多数の投票にもかかわらず、この回答は有用で正当なスタックオーバーフローの回答にはなりません。Stack Overflow標準とは異なり、これは実質的にリンクのみの回答です。回答自体に具体的で重要な情報を提供して、この回答を改善してください。これにより、外部サイトのステータスに関係なく、情報を利用できるようになります。
エヴァンラーセン

107

System.Windows.FormsのNotifyIconコントロールを使用する必要があります。または、Windows APIが提供するNotify Icon APIを使用することもできます。WPFにはそのような同等の機能はありません。MicrosoftConnectで何度か要求されています。

System.Windows.FormsWPFアプリケーション内からNotifyIconコンポーネントを使用するコードをGitHubに持っています。コードはhttps://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.csで表示できます

要約ビットは次のとおりです。

ShowInTaskbar = Falseで、非表示状態で読み込まれるWPFウィンドウを作成します。

クラスレベルで:

private System.Windows.Forms.NotifyIcon notifyIcon = null;

OnInitialize()の間:

notifyIcon = new System.Windows.Forms.NotifyIcon();
notifyIcon.Click += new EventHandler(notifyIcon_Click);
notifyIcon.DoubleClick += new EventHandler(notifyIcon_DoubleClick);
notifyIcon.Icon = IconHandles["QuickLaunch"];

OnLoaded()の間:

notifyIcon.Visible = true;

インタラクションについては(上記のnotifyIcon.ClickおよびDoubleClickとして示されています):

void notifyIcon_Click(object sender, EventArgs e)
{
    ShowQuickLaunchMenu();
}

ここから、コンテキストメニュー、ポップアップウィンドウなどのWPFコントロールとAPIの使用を再開できます。

とても簡単です。コンポーネントをホストするためにWPFウィンドウを厳密に必要とするわけではありません。これは、WPFアプリにウィンドウを導入するための最も便利な方法です(ウィンドウは通常、App.xamlを介して定義されるデフォルトのエントリポイントです)。同様に、 SWFコンポーネントは、.NET Framework(現在および将来のすべての.NET Frameworkバージョンが構築する.NET Framework)の一部であるため、WPFもサポートする.NET Frameworkインストールに存在することが保証されているため、WPFラッパーまたはサードパーティコントロールが必要です。これまでのところ、MicrosoftからSWFサポートが.NET Frameworkからすぐに削除されることを示す兆候はありません。

お役に立てば幸いです。

トレイアイコンを取得するために3.0より前のフレームワークコンポーネントを使用する必要があるのは小さなチーズですが、当然のことながらMicrosoftが説明しているように、WPFの範囲内にシステムトレイの概念はありません。WPFはプレゼンテーション技術であり、通知アイコンはオペレーティングシステム(「プレゼンテーション」ではない)の概念です。


2
詳しい説明ありがとうございます!
Michael Stum

4
+1、これは説明だけの選択された答えであるべきです。
ToastyMallows 2013

2
最後の段落に対する称賛。それはまさに私が知る必要があったことでした。そして、優れた開発者をたたくのは、このレベルの単純で洞察に富んだ詳細です。
マシューレイトン

1
最後の段落の「WPFはWindowsのみです」という面白い部分は、Microsoftが.NET CoreでWPFクロスプラットフォームを作成しない言い訳になりました。それでは、Windows専用ですが、Windows固有の機能を公開するのに十分なWindows専用ではありませんか?
McGuireV10

1
私のWPFアプリでSystem.Windows.Formsへの参照が嫌いなのは私だけですか?
Joel、

48

私は最近同じ問題を抱えていました。残念ながら、NotifyIconは現時点ではWindows.Formsコントロールにすぎません。使用したい場合は、フレームワークのその部分を含める必要があります。それはあなたがどれだけWPF純粋主義者であるかによると思います。

すばやく簡単に始める方法が必要な場合は、WinForms NotifyIconにまったく依存しないコードプロジェクトのこのWPF NotifyIconコントロール確認してください。より新しいバージョンは、作者のWebサイトおよびNuGetパッケージとして入手できるようです。これは、これまでのところ、私にとって最良かつ最もクリーンな方法のようです。

  • テキストではなく豊富なツールチップ
  • WPFコンテキストメニューとポップアップ
  • コマンドサポートとルーティングイベント
  • 柔軟なデータバインディング
  • OSが提供するデフォルトのメッセージではなく、豊富なバルーンメッセージ

見てみな。素晴らしいサンプルアプリも付属しており、非常に使いやすく、見栄えの良いWindows Live MessengerスタイルのWPFポップアップ、ツールチップ、およびコンテキストメニューを使用できます。RSSフィードを表示するのに最適です。同様の目的で使用しています。


5
2017年の初心者のために、そのnugetパッケージは廃止されましたが、別の名前でnuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.