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 中发生
在列表中使用 add 时出现 ArgumentOutOfRange 错误。 Unity C# [重复]
尝试单击带有 selenium 和 Python 的超链接时出现 NoSuchElementException 错误 [重复]