Я думаю, что проблема в строке
if (Box == PassBox)
Box.UseSystemPasswordChar = true;
в методе EnterBox
. Когда вы звоните Box.UseSystemPasswordChar = true;
, вы устанавливаете TextBox
в ограниченный режим (как вы можете прочитать в разделе здесь ). Когда TextBox
переведен в ограниченный режим, он теряет фокус, и событие PassBox_Leave
генерируется. Это причина, по которой отладка ведет себя так, как вы описали.
Если вы хотите убедиться, что событие PassBox_Entered
завершено до того, как будет сделан любой вызов PassBox_Leave
, вам нужно убедиться, что ни одна строка кода в EnterBox
не переключает фокус с TextBox
. В настоящее время это делается по линии Box.UseSystemPasswordChar = true;
в EnterBox
.
Однако это способы обойти эту проблему, например, с помощью логических флагов. Это решение не может быть оптимальным, но должно работать.
Поскольку PassBox_Leave
может вызываться либо Box.UseSystemPasswordChar = true;
(где вы не хотите, чтобы что-либо в LeaveBox
было выполнено), либо когда пользователь покидает TextBox
(где вы хотите, чтобы LeaveBox
выполнить) вы можете использовать логический флаг в своем классе и установить его на true
до выполнения строки Box.UseSystemPasswordChar = true;
в EnterBox
. Затем в первых строках LeaveBox
вы проверяете, является ли логический флаг true
и возвращаете ли вы его, следовательно, ничего в LeaveBox
не будет выполнено (однако PassBox_Leave
все равно будет вызываться, поэтому это может быть оптимальное решение).
Public Class YourClass {
private bool falseCall; //Add this boolean flag as an attribute to your class
public YourClass() {
falseCall = false; //Set the inital value to false in the constructor of your class;
}
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) {
falseCall = true; //Set the flag to true before the call to LeaveBox is executed
Box.UseSystemPasswordChar = true;
}
Box.TextAlign = HorizontalAlignment.Left;
}
//-------Rest of method-----------
}
private void LeaveBox(TextBox Box, string Text, PictureBox PicBox, Bitmap Pic, Label WarningLabel)
{
if(falseCall) {
falseCall = false; //Reset the boolean flag
return;
}
//--------Rest of method-----------
}
}
Таким образом, в основном программа все равно будет вводить LeaveBox
при выполнении Box.UseSystemPasswordChar = true;
, но она быстро вернется, поскольку флаг был установлен в true. Когда пользователь покидает TextBox
, флаг будет ложным, и LeaveBox
будет выполняться, как предполагалось.