C# WPF 在单击重复操作时出现气球提示问题

Posted

技术标签:

【中文标题】C# WPF 在单击重复操作时出现气球提示问题【英文标题】:C# WPF Issues With Balloon Tip On Click Repeating Actions 【发布时间】:2021-09-06 00:25:22 【问题描述】:

我可能错过了明显的内容,请耐心等待,因为我正在学习此版本,但我遇到了一个 WPF 应用程序问题,该应用程序使用气球提示通知用户事件,然后他们单击气球提示打开一个窗口,为他们提供更多信息。这很好用,但我们需要多线程处理气球提示,以便一次显示多个,这就是我们遇到问题的时候。

显示第一个气球提示,单击它时,我们可以正确打开窗口,关闭窗口,一切正常。当第二个气球提示显示并被点击时,它会生成 2 个新窗口,第三个会生成 3 个,依此类推。

为简单起见,我们测试的两个事件是由对象设置的计时器。我将贯穿整个过程,因为我不确定我们的问题在哪里。

对象定义如下:-

public class Item
    
        public string ItemID  get; set; 
        public string ItemName  get; set; 
        public string ItemText  get; set; 
        public string ConfigValue  get; set; 
    

我们有 2 个项目集,我们将它们添加到一个名为 repeatItems 的列表中:-

Item1 (ItemID = "1", ItemName = "Item1", ItemText = "Test text for item1", ConfigValue = "1")
Item2 (ItemID = "2", ItemName = "Item2", ItemText = "Test text for item2", ConfigValue = "2")

然后我们使用任务工厂来允许我们设置 2 个单独的计时器:-

//Create Task Factory to handle Repeat Items
var repTaskFactory = new TaskFactory();

//Create Thread for Repeat Items
foreach (Item item in repeatItems)

    repTaskFactory.StartNew(() => RepItem(item));

RepItem函数定义如下:-

//Function to handle Repeat Items
        public async void RepItem(Item item)
        
            //Create a new custom timer
            var repTimer = new CustomTimer();

            //assign Item details to the timer
            repTimer.item = item;

            //create and set the timer time value as confiog value is in Minutes
            var mil = Int32.Parse(nudge.ConfigValue) * 60 * 1000;
            repTimer.Interval = mil;

            //set the response for the timer ending
            repTimer.Elapsed += ItemAction;

            //cause timer to autorepeat
            repTimer.AutoReset = true;

            //Start the timer
            repTimer.Enabled = true;
        

调用的 CustomTimer 设置如下,以允许它携带附加信息以供以后调用:-

class CustomTimer : System.Timers.Timer
    
        public Item item;
    

动作函数是:-

public void ItemAction(Object source, ElapsedEventArgs e)
        
            //Create ability to multi thread allowing multiple balloon tips to be displayed
            var balloonTaskFactory = new TaskFactory();
            
            //Get details from the sending time
            CustomTimer timer = (CustomTimer)source;

            //Get Item from the timer type
            Item item = new Item();
            item = timer.item;

            //Create new thread and show ballon tip
            balloonTaskFactory.StartNew(() => CreateItemBalloonTip(item));         
        

最后我们创建并显示气球提示:-

public void CreateItemBalloonTip(Item item)
        
            //Set details of Balloon Tip
            m_notifyIcon.BalloonTipText = item.ItemText;
            m_notifyIcon.BalloonTipTitle = item.ItemName;
            m_notifyIcon.BalloonTipClicked += new EventHandler(ItemBalloonTipClicked);

            m_notifyIcon.ShowBalloonTip(2000);
        

ItemBalloonTipClicked 相当简单,它会打开一个新窗口并将 item.ItemName 传递给它:-

public void ItemBalloonTipClicked(Object sender, EventArgs e)
        
            NotifyIcon cust = (NotifyIcon)sender;

            string item = cust.BalloonTipTitle;
            Window1 win2 = new Window1(item);
            win2.Show();
        

我猜BalloonTipClicked 的监听器没有关闭并且一遍又一遍地触发?我该如何处理这个问题?

提前致谢。

【问题讨论】:

【参考方案1】:

尝试在click事件处理程序中为BalloonTipClicked事件取消注册事件处理程序:

public void ItemBalloonTipClicked(Object sender, EventArgs e)

    NotifyIcon cust = (NotifyIcon)sender;
    cust.BalloonTipClicked -= ItemBalloonTipClicked; // <--

    string item = cust.BalloonTipTitle;
    Window1 win2 = new Window1(item);
    win2.Show();

【讨论】:

效果很好,谢谢。我知道我错过了一些简单的东西:)

以上是关于C# WPF 在单击重复操作时出现气球提示问题的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF C# 中保存图像时出现错误 System.UnauthorizedAccessException 在 mscorlib.dll 中发生

求助 关机问题;关机时出现:结束程序-12345

在列表中使用 add 时出现 ArgumentOutOfRange 错误。 Unity C# [重复]

C# WPF - 按钮单击的长时间操作

尝试单击带有 selenium 和 Python 的超链接时出现 NoSuchElementException 错误 [重复]

c#多键字典,用自己的可变类替换元组时出现“KeyNotFoundException”[重复]