我有一个文本框,其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%的时间我需要这个活动才能像这样工作。
但我只需要一个特定按钮点击NOT即可开启它。
按钮点击:
private void BtnClearClick(object sender, EventArgs e)
{
ClearForm();
LotFocus(true);
}
我尝试了显而易见的使用全局bool变量并在click事件中将其设置为false并在离开时检查它但它不起作用..我怀疑这与异步有关吗?
其他信息:
我尝试创建一个bool变量needTxtValidation
并尝试在按钮点击,文本框按键,按钮mousedown等各个位置将其设置为false,但它没有用。
答案 0 :(得分:1)
好吧,这是我设法找到的肮脏方式。您需要继承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;
}
...
}
这有效,但我不保证它会一直继续工作。您可能需要解决一些我错过的角落案例或明显的事情。这是一个非常hacky的代码,你最好重新设计逻辑。