我有以下情况。用户在文本框中输入数量,然后单击按钮提交。文本框在“ LostFocus”上更新其ViewModel,并且按钮在单击时执行命令。为了使事情变得更复杂,两个事件都触发了异步操作,这些操作通过SemaphoreSlim进行了同步(在执行命令之前,应在LostFocus上更新数据)。在极少数情况下,我怀疑Clicked-Event在LostFocus之前引发。那有可能吗?我想知道在这种情况下是否可以保证在单击按钮事件之前总是引发FocusLost事件?
答案 0 :(得分:1)
根据测试, Clicked 事件之前会触发 LostFocus ,但是由于它是异步的,因此有可能在之前处理 Clicked LostEvent 完成。如果要确保顺序,可以使用一些同步对象,例如async version of AutoResetEvent。示例如下:
AsyncAutoResetEvent resetEvent = new AsyncAutoResetEvent();
private async void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Starting lost focus");
await Task.Delay(3000);
resetEvent.Set();
Debug.WriteLine("Leaving lost focus");
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Clicking button");
await resetEvent.WaitAsync();
Debug.WriteLine("Finishing with click event");
}