我使用c#创建了一个hangman应用程序。现在我希望你收到一封错误的通知,以及你剩下多少机会。这有效,但我的通知不断重复。我试图在我的通知后面产生“休息”。但这不起作用。
这是我的代码
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
//status 1 van het galgje poppetje
if (status >= 1)
{
//geeft notificatie nog 9 kansen
notifyIcon1.BalloonTipText = "1 kans minder, je hebt nog 9 kansen";
notifyIcon1.Icon = SystemIcons.Exclamation;
notifyIcon1.ShowBalloonTip(1000);
e.Graphics.DrawLine(new Pen(Color.Black, 2), 85, 190, 210, 190);
}
//status 2 van het galgje poppetje
if (status >= 2)
{
//geeft notificatie nog 8 kansen
notifyIcon1.BalloonTipText = "1 kans minder, je hebt nog 8 kansen";
notifyIcon1.Icon = SystemIcons.Exclamation;
notifyIcon1.ShowBalloonTip(1000);
e.Graphics.DrawLine(new Pen(Color.Black, 2), 148, 190, 148, 50);
}
}
重绘控件(在您的情况下为Form1)时会引发Paint事件(https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.paint?view=netframework-4.7.2)。这种情况发生在很多情况下,例如调整窗口大小,绘制到表单等等。尝试将通知逻辑移动到用户输入他们的游戏信件时运行的事件。我们需要查看更多您的项目以获得更具体的答案。
这里有一个关于如何只触发一次通知的一个非常简单的例子:我已经迷上了LostFocus
,但你可以挂钩到TextChanged
。
using System;
using System.Windows.Forms;
using WindowsFormsApp2.Properties;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.LostFocus += OnLostFocus;
textBox2.LostFocus += OnLostFocus;
textBox3.LostFocus += OnLostFocus;
notifyIcon1.Icon = Resources.Icon1;
}
private void OnLostFocus(object sender, EventArgs e)
{
var textBox = sender as TextBox;
if (textBox == null)
throw new ArgumentNullException(nameof(textBox));
// check for condition
if (int.TryParse(textBox.Text, out var result))
return;
// show error
notifyIcon1.BalloonTipText = "Error!";
notifyIcon1.ShowBalloonTip(5000);
}
}
}
请注意,以这种方式报告错误是非常糟糕的用户体验,您应该考虑使用另一种机制而不是NotifyIcon
:)
您是否收到多个通知,因为if
条件是>=
所以当status
例如8
时:
status >= 1
将是真的,notifyIcon1.ShowBalloonTip(1000)
将会运行status >= 2
也将是真的,另一个ShowwBallonTip将会运行所以你可能需要重新排序和重构if
语句,第一个将是if
,以下语句将是else if
EG
if (status >= 3)
{
// code
}
else if (status >= 2)
{
// code
}
else if (status >= 1)
{
// and so on
}
看起来你实际上并不需要>=
比较而是==
。