Ứng dụng WPF chỉ có biểu tượng khay


144

Tôi là một người mới hoàn toàn WPF và tự hỏi liệu có ai có thể cho tôi một số gợi ý về cách viết một ứng dụng bắt đầu thu nhỏ vào khay không. Ý tưởng là nó định kỳ tìm nạp RSS Feed và tạo Toaster-Popup khi có nguồn cấp dữ liệu mới.

Ứng dụng vẫn phải có Cửa sổ chính (về cơ bản chỉ là một danh sách chứa tất cả các mục nhập nguồn cấp dữ liệu), nhưng nó sẽ bị ẩn theo mặc định.

Tôi đã bắt đầu đọc về XAML và WPF và tôi biết rằng StartupUri trong App.xaml phải trỏ đến cửa sổ chính của tôi, nhưng tôi không biết cách nào phù hợp để làm biểu tượng SysTray và ẩn cửa sổ chính (cũng vậy có nghĩa là khi người dùng thu nhỏ cửa sổ, nó sẽ thu nhỏ vào khay, không chuyển sang thanh tác vụ).

Có gợi ý nào không?


3
Cảm ơn tất cả những lời đề nghị! WPF-NotifyIcon là những gì tôi sẽ thực hiện, vì một thử nghiệm nhanh cho thấy nó khá hứa hẹn và không gây đau đớn.
Michael Stum

Câu trả lời:


114

Không có NotifyIcon cho WPF.

Một đồng nghiệp của tôi đã sử dụng thư viện có sẵn miễn phí này để có hiệu quả tốt:


2
Thư viện tuyệt vời. Không thể chờ đợi để sử dụng nó!
Cướp Hay

2
Drew, liên kết dường như đã chết ở đây. Bạn có một liên kết thay thế cho thư viện này? Tôi đã thực hiện một tìm kiếm nhanh, nhưng không thể xác định liệu kết quả có cho cùng một dự án hay không.
Brad Larson

@BradLarson, trang web dường như ngừng hoạt động; nhưng dù sao thì dự án cũng có sẵn dưới dạng gói Nuget (xem câu trả lời của Dale)
Thomas Levesque

4
Số lượng lớn phiếu bầu mặc dù, câu trả lời này không phải là câu trả lời Stack Overflow hữu ích, hợp pháp. Đây thực sự là một câu trả lời chỉ liên kết, trái với các tiêu chuẩn Stack Overflow. Vui lòng cải thiện câu trả lời này bằng cách cung cấp thông tin cụ thể, cụ thể trong chính câu trả lời. Điều này sẽ đảm bảo thông tin có sẵn bất kể trạng thái của trang bên ngoài.
Evan Larsen

107

Bạn phải sử dụng điều khiển NotifyIcon từ System.Windows.Forms hoặc cách khác, bạn có thể sử dụng API biểu tượng thông báo do API Windows cung cấp. WPF Cung cấp không tương đương như vậy và nó đã được yêu cầu trên Microsoft Connect nhiều lần.

Tôi có mã trên GitHub sử dụng System.Windows.FormsThành phần NotifyIcon từ trong ứng dụng WPF, mã này có thể được xem tại https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Dưới đây là các bit tóm tắt:

Tạo một cửa sổ WPF với ShowInTaskbar = false và được tải ở trạng thái không nhìn thấy được.

Ở cấp độ lớp học:

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

Trong thời gian OnInitialize ():

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

Trong thời gian OnLoaded ():

notifyIcon.Visible = true;

Và để tương tác (được hiển thị dưới dạng notifyIcon.Click và DoubleClick ở trên):

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

Từ đây, bạn có thể tiếp tục sử dụng Điều khiển và API của WPF như menu ngữ cảnh, cửa sổ bật lên, v.v.

Nó đơn giản mà. Bạn không thực sự cần một Cửa sổ WPF để lưu trữ thành phần, đó chỉ là cách thuận tiện nhất để giới thiệu một ứng dụng vào Ứng dụng WPF (vì Cửa sổ nói chung là điểm nhập mặc định được xác định qua App.xaml), tương tự, bạn không ' Không cần WPF Wrapper hoặc kiểm soát của bên thứ 3, vì thành phần SWF được đảm bảo có trong bất kỳ cài đặt .NET Framework nào cũng có hỗ trợ WPF vì nó là một phần của .NET Framework (mà tất cả các phiên bản .NET Framework hiện tại và tương lai đều xây dựng.) Cho đến nay, không có dấu hiệu nào từ Microsoft rằng hỗ trợ SWF sẽ sớm bị loại bỏ khỏi .NET Framework.

Mong rằng sẽ giúp.

Đó là một pho mát nhỏ mà bạn phải sử dụng Thành phần khung trước 3.0 để có biểu tượng khay, nhưng có thể hiểu như Microsoft đã giải thích, không có khái niệm nào về Khay hệ thống trong phạm vi WPF. WPF là một công nghệ trình bày và Biểu tượng thông báo là một khái niệm Hệ điều hành (không phải là "Bản trình bày").


2
Cảm ơn vì lời giải thích chi tiết!
Michael Stum

4
+1, đây sẽ là câu trả lời được chọn cho phần giải thích.
ToastyMallows

2
Kudos cho đoạn cuối đó. Đó chính xác là những gì tôi cần biết, và đây là mức độ chi tiết đơn giản, sâu sắc mà đánh vào một nhà phát triển giỏi.
Matthew Layton

1
Phần thú vị về đoạn cuối đó là "WPF chỉ dành cho Windows" hiện là lý do của Microsoft cho việc không tạo nền tảng chéo WPF trên .NET Core. Vì vậy, nó chỉ dành cho Windows, nhưng không đủ Windows để hiển thị các tính năng dành riêng cho Windows?
McGuireV10

1
Tôi là người duy nhất không thích các tham chiếu đến System.Windows.Forms trong Ứng dụng WPF của tôi?
Joel

48

Gần đây tôi đã có vấn đề tương tự. Thật không may, NotifyIcon chỉ là một điều khiển Windows.Forms tại thời điểm này, nếu bạn muốn sử dụng nó, bạn sẽ phải bao gồm một phần của khung. Tôi đoán điều đó phụ thuộc vào mức độ của một người theo chủ nghĩa thuần túy WPF.

Nếu bạn muốn một cách nhanh chóng và dễ dàng để bắt đầu, hãy kiểm soát WPF NotifyIcon này trên Dự án mã không dựa vào WinForms NotifyIcon. Một phiên bản gần đây hơn dường như có sẵn trên trang web của tác giả và dưới dạng gói NuGet . Đây có vẻ là cách tốt nhất và sạch nhất đối với tôi cho đến nay.

  • ToolTips phong phú hơn là văn bản
  • Menu ngữ cảnh và cửa sổ bật lên WPF
  • Hỗ trợ lệnh và các sự kiện định tuyến
  • Ràng buộc dữ liệu linh hoạt
  • Tin nhắn bóng bay phong phú thay vì tin nhắn mặc định do HĐH cung cấp

Kiểm tra nó ra. Nó cũng đi kèm với một ứng dụng mẫu tuyệt vời, rất dễ sử dụng và bạn có thể có các cửa sổ bật lên WPF, chú giải công cụ và menu ngữ cảnh tuyệt vời của Windows Live Messenger. Hoàn hảo để hiển thị một nguồn cấp dữ liệu RSS, tôi đang sử dụng nó cho một mục đích tương tự.


5
đối với người mới vào năm 2017, gói nuget đó đã lỗi thời nhưng được xuất bản dưới một tên khác là nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.