عدم نمایش BallonTip در WPF

با سلام

ببخشید سوالاتم زیاد شده. من یک notify icon توی WPF طراحی کردم اما هر کاری میکنم توی ناحیه Notification area ویندوز Ballon Tip به من نشون نمیده. این هم کدش هست:


کد:
using System;
using System.Windows.Media;
using System.Windows;
using System.Windows.Controls;
using System.IO;
using System.ComponentModel;
using System.Drawing;
using System.Threading;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private System.Windows.Forms.NotifyIcon icon;
        private System.Windows.Forms.ContextMenu contextMenuTrayIcon;
        private System.Windows.Forms.MenuItem menuItemShowForm;
        private System.Windows.Forms.MenuItem menuItemExitForm;
        private IContainer components;
        public MainWindow()
        {
            InitializeComponent();
            components = new Container();
            contextMenuTrayIcon = new System.Windows.Forms.ContextMenu();
            menuItemShowForm = new System.Windows.Forms.MenuItem();
            menuItemShowForm.Text = "Show Form";
            menuItemShowForm.Index = 0;
            menuItemShowForm.Click += MenuItemShowForm_Click;
            menuItemExitForm = new System.Windows.Forms.MenuItem();
            menuItemExitForm.Text = "Exit";
            menuItemExitForm.Index = 1;
            menuItemExitForm.Click += MenuItemExitForm_Click;
            icon = new System.Windows.Forms.NotifyIcon(this.components);
            icon.Icon = new System.Drawing.Icon("Image/index.ico");
            this.contextMenuTrayIcon.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { menuItemShowForm, menuItemExitForm });
            this.icon.ContextMenu = contextMenuTrayIcon;
            this.icon.Text = "WPF Application";
            this.icon.Visible = true;
            this.icon.DoubleClick += Icon_DoubleClick;
        }
        private void Icon_DoubleClick(object sender, EventArgs e)
        {
            this.Show();
        }
        private void MenuItemShowForm_Click(object sender, EventArgs e)
        {
            
        }
        private void MenuItemExitForm_Click(object sender, EventArgs e)
        {
            Application.Current.Shutdown();
        }
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
            this.icon.BalloonTipTitle = "Notify Ballon";
            this.icon.BalloonTipText = "WPF app";
            this.icon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
            this.icon.ShowBalloonTip(5);
        }
    }
}
 

the_king

مدیرکل انجمن
با سلام

ببخشید سوالاتم زیاد شده. من یک notify icon توی WPF طراحی کردم اما هر کاری میکنم توی ناحیه Notification area ویندوز Ballon Tip به من نشون نمیده. این هم کدش هست:


کد:
using System;
using System.Windows.Media;
using System.Windows;
using System.Windows.Controls;
using System.IO;
using System.ComponentModel;
using System.Drawing;
using System.Threading;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        private System.Windows.Forms.NotifyIcon icon;
        private System.Windows.Forms.ContextMenu contextMenuTrayIcon;
        private System.Windows.Forms.MenuItem menuItemShowForm;
        private System.Windows.Forms.MenuItem menuItemExitForm;
        private IContainer components;
        public MainWindow()
        {
            InitializeComponent();
            components = new Container();
            contextMenuTrayIcon = new System.Windows.Forms.ContextMenu();
            menuItemShowForm = new System.Windows.Forms.MenuItem();
            menuItemShowForm.Text = "Show Form";
            menuItemShowForm.Index = 0;
            menuItemShowForm.Click += MenuItemShowForm_Click;
            menuItemExitForm = new System.Windows.Forms.MenuItem();
            menuItemExitForm.Text = "Exit";
            menuItemExitForm.Index = 1;
            menuItemExitForm.Click += MenuItemExitForm_Click;
            icon = new System.Windows.Forms.NotifyIcon(this.components);
            icon.Icon = new System.Drawing.Icon("Image/index.ico");
            this.contextMenuTrayIcon.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { menuItemShowForm, menuItemExitForm });
            this.icon.ContextMenu = contextMenuTrayIcon;
            this.icon.Text = "WPF Application";
            this.icon.Visible = true;
            this.icon.DoubleClick += Icon_DoubleClick;
        }
        private void Icon_DoubleClick(object sender, EventArgs e)
        {
            this.Show();
        }
        private void MenuItemShowForm_Click(object sender, EventArgs e)
        {
            
        }
        private void MenuItemExitForm_Click(object sender, EventArgs e)
        {
            Application.Current.Shutdown();
        }
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
            this.icon.BalloonTipTitle = "Notify Ballon";
            this.icon.BalloonTipText = "WPF app";
            this.icon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
            this.icon.ShowBalloonTip(5);
        }
    }
}

واحد timeout در ShowBalloonTip میلی ثانیه است، برای 5 ثانیه باید 5000 میلی ثانیه بنویسید.

کد:
        private void Icon_DoubleClick(object sender, EventArgs e)
        {
            this.Show();
        }

        private void MenuItemShowForm_Click(object sender, EventArgs e)
        {
            this.Show();
        }

        private void MenuItemExitForm_Click(object sender, EventArgs e)
        {
[B][COLOR="#0000FF"]            icon.Dispose();[/COLOR][/B]
            Application.Current.Shutdown();
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = true;
            Hide();
            icon.BalloonTipTitle = "Notify Ballon";
            icon.BalloonTipText = "WPF app";
            icon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
[B][COLOR="#0000FF"]            icon.ShowBalloonTip(5000);[/COLOR][/B]
        }
 
جناب مدیر ممنون اما اون رویداد MenuItemExitForm برای خارج شدن از برنامه هست نه مینیمم شدن برنامه در notify area. توی رویداد window_closing هست که میخوام بالون نشون داده بشه اما مقدار 5000 گذاشتم باز نتیجه نداد.

یه سوال دیگه : با خود WPF میشه notify icon طراحی کرد؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
جناب مدیر ممنون اما اون رویداد MenuItemExitForm برای خارج شدن از برنامه هست نه مینیمم شدن برنامه در notify area. توی رویداد window_closing هست که میخوام بالون نشون داده بشه اما مقدار 5000 گذاشتم باز نتیجه نداد.
متوجه نشدم مینیمم رو برای چه موردی مطرح کردید، فراموش نکنید که NotifyIcon تون رو قبل از خروج از برنامه dispose کنید، چون آیکونش ممکنه با وجود اتمام برنامه تا Refresh مجدد Taskbar همچنان نشون داده بشه.
کد تون مشکلی نداره، نمی دونم چرا بالون رو نمی بینید. وقتی برنامه در حال اجرا است آیکون های مخفی Taskbar رو بررسی کنید، آیکون برنامه تون احتمالا جزو اونها است.

مشاهده پیوست WpfApplication2.zip

یه سوال دیگه : با خود WPF میشه notify icon طراحی کرد؟
خود NotifyIcon ترکیب چند تا سرویس API استاندارد ویندوز ئه، اون قسمتی اش که آیکون توی Taskbar قرار بگیره و با کلیک کردن رویش کاری انجام بشه رو نه، باید از همون API های ویندوز استفاده بشه
که NotifyIcon به ساده ترین حالت براتون انجام داده. اما اون بخشی که مربوط به نمایش بالون ئه، یا حتی نمایش منو ئه، بله، اختیارش با شما است، شما هر جور پنجره ای که بسازید می توانید برای چند ثانیه
نشون بدید و بعد محو کنید، کنترل Opacity پنجره هم که دست خودتونه.
 
ممنون از کمکتون درست شد. اما نمیدونم چرا اون ایکونی که من میخوام نشون نمیده همه اش ارور میده که هیچ فایلی در پوشه debug نیست؟

کامپونتی هست توی WPF که کار notify icon را انجام بده؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون از کمکتون درست شد. اما نمیدونم چرا اون ایکونی که من میخوام نشون نمیده همه اش ارور میده که هیچ فایلی در پوشه debug نیست؟

کامپونتی هست توی WPF که کار notify icon را انجام بده؟
مطمئن شوید که در پوشه Bin\Debug اون پوشه Image و آیکون index.ico رو ایجاد کرده اید و بعد اون مسیر فایل Image/index.ico رو به Image\\index.ico تغییر دهید.

Hardcodet WPF NotifyIcon
image13.png


مشاهده پیوست hardcodet.notifyicon.wpf.1.0.8.zip

hardcodet.net WPF NotifyIcon
 
ممنون از جوابتون. حالا پوشه مربوط به آیکن حتما باید در داخل Debug تعریف شود؟ چون من هر جایی غیر از Debug تعریف میکنم میگه باید همون جا تعریف بشه. دلیلش چیه؟
 

the_king

مدیرکل انجمن
ممنون از جوابتون. حالا پوشه مربوط به آیکن حتما باید در داخل Debug تعریف شود؟ چون من هر جایی غیر از Debug تعریف میکنم میگه باید همون جا تعریف بشه. دلیلش چیه؟
اولا اینکه فایل icon مورد استفاده داخل برنامه رو بیرون برنامه قرار می دهید مناسب وقتی است که قراره کاربر بتونه راحت عوضش کنه، اگه چنین قصدی ندارید بصورت Resource داخل پروژه تون تعریف اش کنید تا جزئی از فایل exe برنامه تون باشه.
ثانیا شما مسیر فایل رو نسبی تعریف کرده اید، مسیری که شامل درایو نباشه نسبی ئه، Image\index.ico نسبت به محلی سنجیده میشه که فایل اجرایی قرار داره، هر جا فایل اجرایی رو ببرید نسبت به اونجا سنجیده میشه،
از اونجایی که بصورت پیشفرض فایل اجرایی تون در پوشه Bin\Debug ساخته میشه و از اونجا اجرا میشه، پس پوشه Image هم باید اونجا باشه.

در منوی Project گزینه ...project name} Properties} رو انتخاب کنید. در زبانه Resources با Ctrl + 3 گروه Icons رو انتخاب کنید و با ...Add Resource > Add Existing File آیکون رو به Resource اضافه کنید و در صورت لزوم نامش را تغییر دهید.
حالا با کدی شبیه به این می توانید در پروژه تون ازش استفاده کنید :
کد:
            icon.Icon = Properties.Resources.[B][COLOR="#0000FF"]icon_name[/COLOR][/B];
 

جدیدترین ارسال ها

بالا