C#通知不断重复

问题描述 投票:-1回答:3

我使用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);
            }
        }
c# winforms notifications
3个回答
0
投票

重绘控件(在您的情况下为Form1)时会引发Paint事件(https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.paint?view=netframework-4.7.2)。这种情况发生在很多情况下,例如调整窗口大小,绘制到表单等等。尝试将通知逻辑移动到用户输入他们的游戏信件时运行的事件。我们需要查看更多您的项目以获得更具体的答案。


0
投票

这里有一个关于如何只触发一次通知的一个非常简单的例子:我已经迷上了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 :)


0
投票

您是否收到多个通知,因为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
}

看起来你实际上并不需要>=比较而是==

© www.soinside.com 2019 - 2024. All rights reserved.