簡體   English   中英

notifyicon沒有引發點擊事件,contextmenustrip沒有顯示

[英]notifyicon not raising click event and contextmenustrip not showing

我有一個問題,當notifyicon正常顯示並顯示其氣泡時,但是單擊時它不會引發click事件。

它應該顯示它的contextmenustrip,但是如果我添加contextmenustrip.show(); 到代碼中,它僅顯示菜單的陰影,而不顯示菜單本身。

該函數是WPF應用程序的一部分,並通過WCF服務應用程序中的命名管道進行調用。


代碼,以防您需要:

在服務應用程序中:

public partial class Service1 : ServiceBase
    {
        ChannelFactory<ILicenseWatchingServiceUIHost> pipeFactory;
        ILicenseWatchingServiceUIHost LWSProxy;


        public Service1()
        {
            InitializeComponent();    
        }

        #region service states

        protected override void OnStart(string[] args)
        {
            pipeFactory = new ChannelFactory<ILicenseWatchingServiceUIHost>(
                new NetNamedPipeBinding(),
                new EndpointAddress("net.pipe://localhost/LWSPipe"));
            LWSProxy = pipeFactory.CreateChannel();
            Run();
        }

        //...

        private void Run()
        {
            //...

            LWSProxy.Execute();
        }
    }

在WPF應用中創建服務器:

public partial class App : Application
    {
        ServiceHost host = new ServiceHost(typeof(LicenseWatchingServiceUserInterface), new Uri[] { new Uri("net.pipe://localhost") });

        public App()
        {
            StartServer();
        }

        private void StartServer()
        {
            host.AddServiceEndpoint(typeof(ILicenseWatchingServiceUIHost), new NetNamedPipeBinding(), "LWSPipe");
            host.Open();

            BackgroundWorker worker = new BackgroundWorker();
            System.Windows.Threading.Dispatcher dispatcher = this.Dispatcher;
        }
    }

最后:

public class LicenseWatchingServiceUserInterface : ILicenseWatchingServiceUIHost
    {
        private System.ComponentModel.IContainer components = null;
        private System.Windows.Forms.NotifyIcon notifyIcon;
        private System.Windows.Forms.ContextMenuStrip contextMenuStrip;

        void Execute(){
        //...
        contextmenustrip.show(); //does not work
        }

        //does not get raised
        private void notifyIcon_Click(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                    contextMenuStrip.Show(Cursor.Position.X, Cursor.Position.Y);
                }
                else if (e.Button == MouseButtons.Left)
                {
                    Execute();
                }
            }
        }

        void Init()
        {
            this.components = new System.ComponentModel.Container();
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LicenseWatchingServiceUserInterface));

            this.notifyIcon = new System.Windows.Forms.NotifyIcon();
            this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip();

            // 
            // notifyIcon
            // 
            this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
            this.notifyIcon.ContextMenuStrip = this.contextMenuStrip;
            this.notifyIcon.Icon = iconLoading;
            this.notifyIcon.Visible = true;
            //clickhandler is in fact wired up
            this.notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_Click);
            // 
            // contextMenuStrip
            // 
            this.contextMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20);
            this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.settingsToolStripMenuItem,
            this.openLicenseManagerToolStripMenuItem,
            this.closeToolStripMenuItem});
            this.contextMenuStrip.Name = "contextMenuStrip";
            this.contextMenuStrip.Size = new System.Drawing.Size(234, 128);
            //
            // contextmenustrip items...
            //
        }
        //...
    }

弄清楚了:

LWSProxy.Execute(); 在后台線程中創建LicenseWatchingServiceUserInterface類的實例,這會引起問題。 notifyicon必須在主線程中創建,否則事件處理程序將無法工作。 我的解決方案是一個幫助器類(只需將其放在class App ):

public class LicenseWatchingServiceUICreator : ILicenseWatchingServiceUIHost
    {

        public void Execute(List<LicenseInfoContainerExpiring> elcs, List<LicenseInfoContainerUntrusted> ulcs)
        {
            System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => 
            {
                LicenseWatchingServiceUserInterface LWSUI = new LicenseWatchingServiceUserInterface(elcs, ulcs); 
            }));
        }

    }

稍作調整,該類的execute方法將通過管道進行調用,並將在主線程中創建我的類的實例。 現在,我的UI照常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM