我有一个WPF应用程序需要向用户显示XML文件中对象的名称,等待它们读取它,然后允许它们按下继续按钮并查看下一个。
我已经简化了下面的代码,但需要一种等待按下按钮的方法。
private void Waitforpress()
{
XDocument puppies = XDocument.Load(@"C:\puppies.xml");
foreach (var item in puppies.Descendants("Row")
{
PuppyName = item.Element("puppyName").Value;
// Call Print PuppyName function
// WAIT HERE FOR BUTTON PRESS BEFORE GOING TO NEXT PUPPY NAME
}
}
答案 0 :(得分:3)
您不应该像这样在按钮内部加载文件,我建议您创建一个将文件读入队列的过程,当用户按下按钮时,您会读取下一个排队的项目并将其显示给用户,例如:
Queue<XElement> puppiesQueue = new Queue<XElement>();
void LoadPuppies()
{
XDocument puppies = XDocument.Load(@"C:\puppies.xml");
foreach (XElement puppie in puppies.Descendants("Row"))
puppiesQueue.Enqueue(puppie);
}
void Button_Click()
{
//Each time you click the button, it will return you the next puppie in the queue.
PuppyName = puppiesQueue.Dequeue().Element("puppyName").Value;
}
答案 1 :(得分:1)
您可以使用以下方法创建在单击按钮时完成的Task
:
public static Task WhenClicked(this Button button)
{
var tcs = new TaskCompletionSource<bool>();
RoutedEventHandler handler = null;
handler = (s, e) =>
{
tcs.TrySetResult(true);
button.Click -= handler;
};
button.Click += handler;
return tcs.Task;
}
然后您可以await
该任务,以便在单击按钮后您的方法将继续执行:
private async Task Waitforpress()
{
XDocument puppies = XDocument.Load(@"C:\puppies.xml");
foreach (var item in puppies.Descendants("Row")
{
PuppyName = item.Element("puppyName").Value;
// Call Print PuppyName function
await button.WhenClicked();
}
}
请注意,您可能希望以异步方式执行文件IO,而不是同步,以免阻塞UI线程。