我有一个文本框,其中的 Leave 事件如下所示:
private async void TxtLotTextLeave(object sender, EventArgs e)
{
if (!isChecked)
{
isChecked = true;
var mylength = BarcodeUtil.LotStripZeroes(txtLot.Text.Trim()).Length;
var strippedLot = BarcodeUtil.LotStripZeroes(txtLot.Text.Trim());
if (mylength > 0)
{
if (mylength.Between(16, 18) &&
(strippedLot.StartsWith(AppState.LotOldStandardDigits) ||
strippedLot.StartsWith(AppState.LotStandardDigits)))
{
await GetLotData();
}
else
{
ShowAppMessage(AppMessages["WrongLot"], 0, Color.Black, Color.BlanchedAlmond);
txtLot.Text = "";
LotFocus(true);
}
}
}
}
99% 的时间我需要这个事件像这样工作。
但是我只需要在特定按钮单击"不"时触发它。
按钮点击:
private void BtnClearClick(object sender, EventArgs e)
{
ClearForm();
LotFocus(true);
}
我尝试使用全局布尔变量并在单击事件中将其设置为 false 并在离开时检查它,但它不起作用。我怀疑这与异步有关?
附加信息:
我尝试创建一个布尔变量needTxtValidation
并尝试在按钮单击、文本框按键、按钮鼠标向下等各个地方将其设置为 false,但它不起作用。
好吧,这是我设法找到的肮脏方法。您需要继承Button
,覆盖WndProc
并公开一个布尔值,该布尔值表示当前是否正在处理MouseDown
。
class ButtonEx : Button
{
public bool IsInMouseDown { get; set; }
protected override void WndProc(ref Message m)
{
const int WM_LBUTTONDOWN = 0x0201;
try
{
if (m.Msg == WM_LBUTTONDOWN)
IsInMouseDown = true;
base.WndProc(ref m);
}
finally //Make sure we set the flag to false whatever happens.
{
if (m.Msg == WM_LBUTTONDOWN)//Required to fight with reentracy
IsInMouseDown = false;
}
}
}
然后在您的休假方式中
private async void TxtLotTextLeave(object sender, EventArgs e)
{
if (yourButton.IsInMouseDown)
{
Console.WriteLine("Ignoring Leave");
return;
}
...
}
这有效,但我不能保证它会一直有效。您可能需要解决一些我错过的极端情况或明显的事情。这是一个非常黑客的代码,你最好重新设计逻辑。