แอปพลิเคชัน WPF ที่มีไอคอนถาดเท่านั้น


144

ฉันเป็นมือใหม่ WPF ทั้งหมดและสงสัยว่าใครจะให้คำแนะนำฉันในการเขียนแอปพลิเคชันที่เริ่มย่อขนาดลงในถาด แนวคิดก็คือจะดึงฟีด RSS เป็นระยะและสร้าง Toaster-Popup เมื่อมีฟีดใหม่

แอปพลิเคชันควรยังคงมีหน้าต่างหลัก (เป็นหลักเพียงรายการที่มีรายการฟีดทั้งหมด) แต่ควรซ่อนไว้โดยค่าเริ่มต้น

ฉันเริ่มอ่านเกี่ยวกับ XAML และ WPF และฉันรู้ว่า StartupUri ใน App.xaml ต้องชี้ไปที่หน้าต่างหลักของฉัน แต่ฉันไม่รู้ว่าวิธีที่เหมาะสมคือทำไอคอน SysTray และซ่อนหน้าต่างหลัก (เช่นนี้ด้วย หมายความว่าเมื่อผู้ใช้ย่อเล็กสุดหน้าต่างควรย่อเล็กสุดไปที่ถาดไม่ใช่ไปที่ทาสก์บาร์)

คำใบ้ใด ๆ


3
ขอบคุณสำหรับคำแนะนำทั้งหมด! WPF-NotifyIcon เป็นสิ่งที่ฉันจะไปด้วยการทดสอบอย่างรวดเร็วแสดงให้เห็นว่ามันค่อนข้างมีแนวโน้มและไม่เจ็บปวด
Michael Stum

คำตอบ:


114

ไม่มี NotifyIcon สำหรับ WPF

เพื่อนร่วมงานของฉันใช้ห้องสมุดนี้ที่ให้บริการฟรีเพื่อผลดี:


2
ห้องสมุดที่ยอดเยี่ยม รอไม่ได้ที่จะใช้มัน!
Rob Hay

2
ดึงลิงก์ดูเหมือนจะตายไปแล้วที่นี่ คุณมีลิงค์สำรองสำหรับห้องสมุดนี้หรือไม่? ฉันค้นหาอย่างรวดเร็ว แต่ไม่สามารถระบุได้ว่าผลลัพธ์เป็นโครงการเดียวกันหรือไม่
แบรดลาร์สัน

@BradLarson ดูเหมือนว่าไซต์จะไม่ทำงาน แต่อย่างไรก็ตามโครงการนี้มีให้ในรูปแบบแพคเกจ Nuget (ดูคำตอบของ Dale)
Thomas Levesque

4
จำนวนโหวตจำนวนมากถึงแม้ว่าคำตอบนี้ไม่ได้เป็นคำตอบ Stack Overflow ที่มีประโยชน์และถูกต้องตามกฎหมาย มันเป็นคำตอบสำหรับลิงค์อย่างเดียวอย่างมีประสิทธิภาพซึ่งตรงกันข้ามกับมาตรฐาน Stack Overflow โปรดปรับปรุงคำตอบนี้โดยการให้ข้อมูลวัสดุเฉพาะในคำตอบนั้น วิธีนี้จะช่วยให้มั่นใจได้ว่าข้อมูลจะพร้อมใช้งานโดยไม่คำนึงถึงสถานะของไซต์ภายนอก
Evan Larsen

107

คุณต้องใช้การควบคุม NotifyIcon จาก System.Windows.Forms หรือคุณสามารถใช้ Notify Icon API ที่ Windows API จัดเตรียมให้ WPF ไม่มีสิ่งใดเทียบเท่ากันและได้รับการร้องขอจาก Microsoft Connect หลายครั้ง

ฉันมีรหัสบน GitHub ซึ่งใช้System.Windows.Formsคอมโพเนนต์ NotifyIcon จากภายในแอปพลิเคชัน WPF สามารถดูรหัสได้ที่https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

นี่คือบิตสรุป:

สร้างหน้าต่าง WPF ด้วย ShowInTaskbar = False และโหลดในสถานะที่มองไม่เห็น

ในระดับชั้น:

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;

และสำหรับการโต้ตอบ (แสดงเป็น alertIcon.Click และ DoubleClick ด้านบน):

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

จากที่นี่คุณสามารถใช้ WPF Controls และ API ต่อได้เช่นเมนูบริบทหน้าต่างป๊อปอัปเป็นต้น

มันง่ายมาก คุณไม่จำเป็นต้องใช้ WPF Window เพื่อโฮสต์ส่วนประกอบมันเป็นวิธีที่สะดวกที่สุดในการแนะนำหนึ่งแอพพลิเคชั่น WPF (โดยทั่วไปแล้ว Window เป็นจุดเริ่มต้นที่กำหนดไว้ผ่าน App.xaml) เช่นเดียวกันคุณไม่ต้อง ' ไม่จำเป็นต้องมี WPF Wrapper หรือการควบคุมโดยบุคคลที่สามเนื่องจากมีการรับประกันส่วนประกอบของ SWF ในการติดตั้ง. NET Framework ใด ๆ ซึ่งมีการสนับสนุน WPF เนื่องจากเป็นส่วนหนึ่งของ. NET Framework (ซึ่งเวอร์ชัน NET Framework ปัจจุบันและอนาคตทั้งหมดสร้างขึ้น) จนถึงปัจจุบันไม่มีข้อบ่งชี้จาก Microsoft ว่าการสนับสนุน SWF จะถูกดร็อปจาก. NET Framework เร็ว ๆ นี้

หวังว่าจะช่วย

มันเป็นชีสตัวน้อยที่คุณต้องใช้ชิ้นส่วน Framework 3.0 ล่วงหน้าเพื่อรับไอคอนถาด แต่เข้าใจได้อย่างที่ Microsoft อธิบายไว้ไม่มีแนวคิดของ System Tray ในขอบเขตของ WPF WPF เป็นเทคโนโลยีการนำเสนอและไอคอนการแจ้งเตือนเป็นแนวคิดของระบบปฏิบัติการ (ไม่ใช่แนวคิด "การนำเสนอ")


2
ขอบคุณสำหรับคำอธิบายโดยละเอียด!
Michael Stum

4
+1 นี่คือคำตอบที่เลือกสำหรับคำอธิบายเพียงอย่างเดียว
ToastyMallows

2
รุ่งโรจน์สำหรับวรรคสุดท้าย นั่นคือสิ่งที่ฉันจำเป็นต้องรู้และเป็นระดับของรายละเอียดที่เรียบง่ายและชาญฉลาดซึ่งทำให้นักพัฒนาที่ดี
Matthew Layton

1
ส่วนที่ตลกเกี่ยวกับย่อหน้าสุดท้ายคือ "WPF is Windows-only" ตอนนี้เป็นข้อแก้ตัวของ Microsoft ที่ไม่สร้าง WPF ข้ามแพลตฟอร์มบน. NET Core ดังนั้นจึงเป็น Windows เท่านั้น แต่ไม่เพียงพอสำหรับ Windows เท่านั้นที่จะแสดงคุณลักษณะเฉพาะของ Windows
McGuireV10

1
ฉันเป็นคนเดียวที่ไม่ชอบอ้างอิงถึง System.Windows.Forms ในแอพ WPF ของฉัน
Joel

48

ฉันเพิ่งมีปัญหาเดียวกันนี้ ขออภัย NotifyIcon เป็นเพียง Windows การควบคุมรูปแบบในขณะนี้หากคุณต้องการใช้คุณจะต้องรวมส่วนหนึ่งของเฟรมเวิร์กด้วย ฉันเดาว่าขึ้นอยู่กับว่าคุณเป็นคนเจ้าระเบียบ WPF มากแค่ไหน

หากคุณต้องการวิธีเริ่มต้นที่ง่ายและรวดเร็วในการตรวจสอบWPF NotifyIconนี้ควบคุมในโครงการรหัสซึ่งไม่พึ่งพา WinForms NotifyIcon เลย ดูเหมือนว่ารุ่นที่ใหม่กว่าจะพร้อมใช้งานบนเว็บไซต์ของผู้เขียนและเป็นแพคเกจ NuGet ดูเหมือนจะเป็นวิธีที่ดีที่สุดและสะอาดที่สุดสำหรับฉันจนถึงตอนนี้

  • เคล็ดลับเครื่องมือแทนที่จะเป็นข้อความ
  • เมนูบริบท WPF และป๊อปอัป
  • การสนับสนุนคำสั่งและเหตุการณ์ที่กำหนดเส้นทาง
  • การผูกข้อมูลที่ยืดหยุ่น
  • ข้อความ Rich บอลลูนไม่ใช่ข้อความเริ่มต้นที่ระบบปฏิบัติการจัดหาให้

ลองดูสิ มันมาพร้อมกับแอปตัวอย่างที่น่าทึ่งด้วยเช่นกันใช้งานง่ายมากและคุณสามารถมีป๊อปอัป WPF สไตล์ Windows Live Messenger ที่ดูดีป๊อปอัปคำแนะนำเครื่องมือและเมนูบริบท สมบูรณ์แบบสำหรับการแสดงฟีด RSS ฉันใช้เพื่อจุดประสงค์เดียวกัน


5
สำหรับผู้มาใหม่ในปี 2560 แพ็คเกจ nuget นั้นล้าสมัย แต่ยังเผยแพร่ภายใต้ชื่ออื่นว่าnuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.