C# TextBox.Enter()事件在WinForm中触发TextBox.Leave()事件

C# TextBox.Enter()事件在WinForm中触发TextBox.Leave()事件,c#,winforms,visual-studio-2019,C#,Winforms,Visual Studio 2019,我正在用C#的WinForms制作注册表单。 我在不同的TexBox.Enter() 和TexBox.Leave()事件 private void EnterBox(TextBox Box, string Text, PictureBox PicBox, Bitmap Pic, Label WarningLabel) { if ((Box.Text == Text) && (Box.TextAlign == HorizontalAlignment.Center))

我正在用C#的WinForms制作注册表单。 我在不同的
TexBox.Enter()
TexBox.Leave()
事件

private void EnterBox(TextBox Box, string Text, PictureBox PicBox, Bitmap Pic, Label WarningLabel)
{
    if ((Box.Text == Text) && (Box.TextAlign == HorizontalAlignment.Center))
    {
        Box.Clear();

        if (Box == PassBox)
            Box.UseSystemPasswordChar = true;
        Box.TextAlign = HorizontalAlignment.Left;
    }
    PicBox.BackgroundImage = Pic;
    WarningLabel.ForeColor = Color.FromArgb(34, 36, 49);
    Box.ForeColor = Color.FromArgb(78, 184, 206);
}

private void LeaveBox(TextBox Box, string Text, PictureBox PicBox, Bitmap Pic, Label WarningLabel)
{
    if (Box.Text == "")
    {
        if (Box == PassBox)
            Box.UseSystemPasswordChar = false;

        WarningLabel.ForeColor = Color.Red;
        Box.Text = Text;
        Box.TextAlign = HorizontalAlignment.Center;
        Box.ForeColor = Color.Gray;
    }
    else
    {
        if (!Regex.IsMatch(Box.Text, (string)Box.Tag))
            WarningLabel.ForeColor = Color.Red;
        Box.ForeColor = Color.White;
    }
    PicBox.BackgroundImage = Pic;
    Box.Select(0, 0);                     // Move the Cursor to Start.
}
它似乎可以很好地处理其他文本框,但不能很好地处理PassBox

private void PassBox_Enter(object sender, EventArgs e)
{
    EnterBox(PassBox, "Password", PasswordPic, Properties.Resources.password__2_, PasswordWarningLabel);
}

private void PassBox_Leave(object sender, EventArgs e)
{
    LeaveBox(PassBox, "Password", PasswordPic, Properties.Resources.password, PasswordWarningLabel);
}
使用
VS-Studio-2019
调试它时,我会在完成测试后输入
PassBox\u enter()
EnterBox()
显示

if ((Box.Text == Text) && (Box.TextAlign == HorizontalAlignment.Center))
    {
        Box.Clear();

        if (Box == PassBox)
            Box.UseSystemPasswordChar = true;
        Box.TextAlign = HorizontalAlignment.Left;
    }
它进入
PassBox\u Leave()
并执行它,然后再次进入
PassBox\u Enter()
并再次执行该函数

我工作得很好,但突然它开始这样做了。
我试图删除以前的TexBox并再次生成另一个box,但它又开始这样做。

我认为问题出在前面

if (Box == PassBox)
            Box.UseSystemPasswordChar = true;
输入框中
方法。调用
Box.UseSystemPasswordChar=true时
文本框
设置为受限模式(可以在“重要信息”下阅读)。当
文本框
处于受限模式时,它将失去焦点,并且将抛出
PassBox\u Leave
事件。这就是调试按照您描述的方式运行的原因

如果要确保在调用
PassBox\u Leave
之前完成输入的
PassBox\u事件,必须确保
EnterBox
中没有代码行从
TextBox
切换焦点。这是当前由行
Box.UseSystemPasswordChar=true
输入框中

但是,它们是通过例如布尔标志来规避此问题的方法。这个解决方案可能不是最优的,但应该有效

因为
PassBox\u Leave
可以由
Box.UseSystemPasswordChar=true
(当您不希望执行
LeaveBox
中的任何内容时)或当用户离开
TextBox
(当您希望执行
LeaveBox
时),您可以在类中使用布尔标志,并在
Box.UseSystemPasswordChar=true行之前将其设置为
true
输入框中的code>。然后在
LeaveBox
的第一行中检查布尔标志是否为
true
,如果为true,则返回,因此将不会执行
LeaveBox
中的任何内容(但是仍然会调用
PassBox\u Leave
,因此这可能不是最佳解决方案)


因此,当
Box.UseSystemPasswordChar=true时,程序基本上仍将进入
LeaveBox
已执行,但它将很快返回,因为该标志已设置为true。当用户离开
TextBox
时,标志将为false,并且
LeaveBox
将按预期执行。

我认为问题就在这一行

if (Box == PassBox)
            Box.UseSystemPasswordChar = true;
输入框中
方法。调用
Box.UseSystemPasswordChar=true时
文本框
设置为受限模式(可以在“重要信息”下阅读)。当
文本框
处于受限模式时,它将失去焦点,并且将抛出
PassBox\u Leave
事件。这就是调试按照您描述的方式运行的原因

如果要确保在调用
PassBox\u Leave
之前完成输入的
PassBox\u事件,必须确保
EnterBox
中没有代码行从
TextBox
切换焦点。这是当前由行
Box.UseSystemPasswordChar=true
输入框中

但是,它们是通过例如布尔标志来规避此问题的方法。这个解决方案可能不是最优的,但应该有效

因为
PassBox\u Leave
可以由
Box.UseSystemPasswordChar=true
(当您不希望执行
LeaveBox
中的任何内容时)或当用户离开
TextBox
(当您希望执行
LeaveBox
时),您可以在类中使用布尔标志,并在
Box.UseSystemPasswordChar=true行之前将其设置为
true
输入框中的code>。然后在
LeaveBox
的第一行中检查布尔标志是否为
true
,如果为true,则返回,因此将不会执行
LeaveBox
中的任何内容(但是仍然会调用
PassBox\u Leave
,因此这可能不是最佳解决方案)

因此,当
Box.UseSystemPasswordChar=true时,程序基本上仍将进入
LeaveBox
已执行,但它将很快返回,因为该标志已设置为true。当用户离开
TextBox
时,该标志将为false,并且
LeaveBox
将按预期执行。

as@Hans Passant和@said更改
UseSystemPasswordChar
每次触发
PassBox\u Leave()
事件。我删除了
if(Box==PassBox)Box.UseSystemPasswordChar=true
如果(Box==PassBox)Box.UseSystemPasswordChar=false来自
LeaveBox()
EnterBox()
并更新了
PassBox\u Enter()
PassBox\u Leave()
,如下所示

private void PassBox_Enter(object sender, EventArgs e)
{
 if (PassBox.TextAlign == HorizontalAlignment.Center)
    PassBox.UseSystemPasswordChar = true;
 EnterBox(PassBox, "Password", PasswordPic, Properties.Resources.password__2_, PasswordWarningLabel);
}

它仍然会触发
PassBox\u Leave()
,但会起作用。

因为@Hans Passant和@said每次更改
UseSystemPasswordChar
都会触发
PassBox\u Leave()
事件。我删除了
if(Box==PassBox)Box.UseSystemPasswordChar=true
如果(Box==PassBox)Box.UseSystemPasswordChar=false来自
LeaveBox()
EnterBox()
并更新了
PassBox\u Enter()
PassBox\u Leave()
,如下所示

private void PassBox_Enter(object sender, EventArgs e)
{
 if (PassBox.TextAlign == HorizontalAlignment.Center)
    PassBox.UseSystemPasswordChar = true;
 EnterBox(PassBox, "Password", PasswordPic, Properties.Resources.password__2_, PasswordWarningLabel);
}


它仍然会触发
PassBox\u Leave()
,但它会工作。

UseSystemPasswordChar属性是一个“困难”属性,它需要Winforms