在foreach等待按下按钮

时间:2015-05-14 17:09:54

标签: c# wpf

我有一个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
    }        
}

2 个答案:

答案 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线程。