Aplikasi WPF yang hanya memiliki ikon tray

144

Saya seorang pemula total WPF dan bertanya-tanya apakah ada yang bisa memberi saya beberapa petunjuk bagaimana menulis aplikasi yang mulai diminimalkan ke baki. Idenya adalah ia mengambil RSS Feed secara berkala dan membuat Toaster-Popup ketika ada feed baru.

Aplikasi masih harus memiliki Jendela Utama (pada dasarnya hanya daftar yang berisi semua entri umpan), tetapi itu harus disembunyikan secara default.

Saya sudah mulai membaca tentang XAML dan WPF dan saya tahu bahwa StartupUri di App.xaml harus mengarah ke jendela utama saya, tetapi saya tidak tahu apa cara yang tepat untuk melakukan ikon SysTray dan menyembunyikan jendela utama (ini juga berarti bahwa ketika pengguna meminimalkan jendela, ia harus meminimalkan ke baki, bukan ke taskbar).

Ada petunjuk?

Michael Stum
sumber
3
Terima kasih atas semua sarannya! WPF-NotifyIcon adalah apa yang akan saya ikuti, karena tes cepat menunjukkan itu cukup menjanjikan dan tidak menyakitkan.
Michael Stum

Jawaban:

114

Tidak ada NotifyIcon untuk WPF.

Seorang kolega saya menggunakan perpustakaan yang tersedia secara gratis ini untuk efek yang baik:

Drew Noakes
sumber
2
Perpustakaan yang fantastis. Tidak sabar untuk menggunakannya!
Rob Hay
2
Drew, tautannya tampaknya sudah mati di sini. Apakah Anda memiliki tautan alternatif untuk perpustakaan ini? Saya melakukan pencarian cepat, tetapi tidak dapat menentukan apakah hasilnya untuk proyek yang sama.
Brad Larson
@BradLarson, situs sepertinya sedang down; tetapi bagaimanapun proyek ini tersedia sebagai paket Nuget (lihat jawaban Dale)
Thomas Levesque
4
Meskipun demikian, jumlah suara yang besar, jawaban ini bukan merupakan jawaban Stack Overflow yang bermanfaat dan sah. Secara efektif ini adalah jawaban tautan saja, bertentangan dengan standar Stack Overflow. Harap perbaiki jawaban ini dengan memberikan informasi spesifik dan material dalam jawaban itu sendiri. Ini akan memastikan informasi tersedia terlepas dari status situs eksternal.
Evan Larsen
107

Anda harus menggunakan kontrol NotifyIcon dari System.Windows.Forms, atau Anda dapat menggunakan Notify Icon API yang disediakan oleh Windows API. WPF Tidak menyediakan yang setara, dan telah diminta di Microsoft Connect beberapa kali.

Saya memiliki kode pada GitHub yang menggunakan System.Windows.FormsKomponen NotifyIcon dari dalam aplikasi WPF, kode tersebut dapat dilihat di https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Berikut adalah ringkasan bit:

Buat Jendela WPF dengan ShowInTaskbar = Salah, dan yang dimuat dalam Status yang Tidak Terlihat.

Di tingkat kelas:

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

Selama OnInisialisasi ():

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

Selama OnLoaded ():

notifyIcon.Visible = true;

Dan untuk interaksi (ditampilkan sebagai notifyIcon.Click dan DoubleClick di atas):

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

Dari sini Anda dapat melanjutkan penggunaan Kontrol WPF dan API seperti menu konteks, jendela sembul, dll.

Sesederhana itu. Anda tidak benar-benar membutuhkan Jendela WPF untuk meng-host ke komponen, itu hanya cara yang paling nyaman untuk memperkenalkan satu ke dalam Aplikasi WPF (karena Window umumnya merupakan titik masuk default yang ditentukan melalui App.xaml), juga, Anda tidak perlu tidak memerlukan WPF Wrapper atau kontrol pihak ke-3, karena komponen SWF dijamin hadir di setiap instalasi .NET Framework yang juga memiliki dukungan WPF karena ini merupakan bagian dari .NET Framework (yang dibuat berdasarkan semua versi .NET Framework saat ini dan di masa mendatang.) Hingga saat ini, tidak ada indikasi dari Microsoft bahwa dukungan SWF akan dihapus dari .NET Framework dalam waktu dekat.

Semoga itu bisa membantu.

Ini adalah keju kecil yang harus Anda gunakan Komponen Kerangka pra-3.0 untuk mendapatkan ikon baki, tetapi dapat dimengerti sebagaimana dijelaskan oleh Microsoft, tidak ada konsep Baki Sistem dalam lingkup WPF. WPF adalah teknologi presentasi, dan Ikon Pemberitahuan adalah konsep Sistem Operasi (bukan "Presentasi").

Shaun Wilson
sumber
2
Terimakasih untuk penjelasan detilnya!
Michael Stum
4
+1, ini harus menjadi jawaban yang dipilih untuk penjelasan saja.
ToastyMallows
2
Kudos untuk paragraf terakhir. Itulah tepatnya yang perlu saya ketahui, dan tingkat detail yang sederhana dan penuh wawasan inilah yang menampar pengembang yang baik.
Matthew Layton
1
Bagian lucu tentang paragraf terakhir adalah "WPF adalah Windows-only" sekarang alasan Microsoft untuk tidak membuat cross-platform WPF pada .NET Core. Jadi ini hanya Windows, tapi bukan Windows saja yang cukup untuk mengekspos fitur spesifik Windows?
McGuireV10
1
Saya satu-satunya yang tidak menyukai referensi untuk System.Windows.Forms di Aplikasi WPF saya?
Joel
48

Baru-baru ini saya memiliki masalah yang sama. Sayangnya, NotifyIcon hanya Windows.Form mengendalikan saat ini, jika Anda ingin menggunakannya Anda harus memasukkan bagian kerangka itu. Saya kira itu tergantung berapa banyak purist WPF Anda.

Jika Anda ingin cara yang cepat dan mudah untuk memulai periksa kontrol NotifikasiIcon WPF ini pada Proyek Kode yang tidak bergantung pada WinForms NotifyIcon sama sekali. Versi yang lebih baru tampaknya tersedia di situs web penulis dan sebagai paket NuGet . Ini sepertinya cara terbaik dan terbersih untuk saya sejauh ini.

  • Tips Alat Kaya daripada teks
  • Menu konteks dan popup WPF
  • Dukungan perintah dan acara yang diarahkan
  • Pengikatan data yang fleksibel
  • Pesan balon kaya daripada pesan standar yang disediakan oleh OS

Saksikan berikut ini. Muncul dengan contoh aplikasi yang luar biasa juga, sangat mudah digunakan, dan Anda dapat memiliki popup, tooltips, dan menu konteks WPF gaya Windows Live Messenger. Sempurna untuk menampilkan umpan RSS, saya menggunakannya untuk tujuan yang sama.

Lembah
sumber
5
untuk pendatang baru di tahun 2017, paket nuget tersebut sudah usang namun diterbitkan dengan nama yang berbeda sebagai nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy