Button_Click
事件的结束。如果单击第一个按钮,它将更改内容,但是当我单击第二个按钮时按钮,无论哪个if
语句触发,第二张卡都不会显示。该代码可以正常工作,直到事件结束,然后发生3秒的延迟]
我想实现的是,您可以在短时间内看到第二张卡在两张卡都被转回或消失之前。
P.S。 -如果我在[延迟]之后加上MessageBox
,似乎可以正常运作但这不是目标,所以是否有等待同步或错过的东西?
代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
int index = ContainderGrid.Children.IndexOf(button);
mCounterSecondPic++;
button.Content = new BitmapImage(new Uri(mImgPath[mPairs[index]]));//change content
mPic[mCounterSecondPic-1] = mPairs[index];
button.IsEnabled = false;
if (mPic[0] == mPic[1] & mCounterSecondPic == 2)
{
mCounterSecondPic = 0;
new System.Threading.ManualResetEvent(false).WaitOne(3000); //wait for 3sec
ContainderGrid.Children.RemoveAt(mPairs.IndexOf(mPic[0]));
mPairs.RemoveAt(mPairs.IndexOf(mPic[0]));
ContainderGrid.Children.RemoveAt(mPairs.IndexOf(mPic[0]));
mPairs.RemoveAt(mPairs.IndexOf(mPic[0]));
}
if (mCounterSecondPic == 2 & mPic[0] != mPic[1])
{
mCounterSecondPic = 0;
new System.Threading.ManualResetEvent(false).WaitOne(3000);//wait for3 sec
ContainderGrid.Children.Cast<Button>().ToList().ForEach(resetbuttons =>
{
resetbuttons.IsEnabled = true;
resetbuttons.Content = new BitmapImage(new Uri(mCardBack));
});
}
ps:如果我在“延迟”之前添加一个messageBox,它似乎可以工作但这不是gole,所以是否有诸如等待同步之类的东西或我错过的东西?
MessageBox.Show("x"); new System.Threading.ManualResetEvent(false).WaitOne(3000);
private void Button_Click(object sender, RoutedEventArgs e)
{
button.Content = "START" //change content
new System.Threading.ManualResetEvent(false).WaitOne(3000); //wait for 3sec
button.Content = "FINISH" //change content
}
以这种方式,您具有以下时间轴:您
您可以看到内容更改(在item1和item4上)不是立即发生,而是很久以后;这是由于以下事实:UI线程在- 设置内容(但不查看/感觉)
您开始等待3秒- 您等待3秒结束
- 您
- 设置
内容(但不查看/感觉)您退出Button_Click
方法- 您实际上
- 看到/感觉
内容更改Button_Click
方法的执行过程中被阻塞,因此无法刷新图形。为了实现您想要的,您有两个选择:使用
async/await
:private async void Button_Click(object sender, RoutedEventArgs e) { button.Content = "START" //change content await Task.Delay(3000); //wait for 3sec asynchronously button.Content = "FINISH" //change content }
Dispatcher
:private void Button_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
Dispatcher.Invoke(() => button.Content = "START");
System.Threading.Thread.Sleep(3000);
Dispatcher.Invoke(() => button.Content = "FINISH");
}).Start();
}