2015-05-14 121 views
0

我有一個WPF應用程序,需要顯示用戶的XML文件中的對象的名稱,等待他們閱讀它,然後讓他們按繼續按鈕,看到下一個。等待按鈕按foreach

我簡化了下面的代碼,但需要一種方法來等待按鈕按下。

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

想法是加載xml內容,並在按鈕上單擊存儲您讀取的最後一個元素。根據讀取下一個點擊下一個元素。 想法是存儲當前索引或任何要遍歷元素的內容。並使用按鈕單擊來迭代。 – Versatile

+0

將名稱存儲在列表中然後通過更改列表索引在按鈕按鈕上顯示它們。 – Nazmul

+0

你有這個回到前面。 WPF運行事件循環,用戶操作是您聆聽和響應的事件。你不能坐下來輪詢按鈕按鈕。 –

回答

4

你真的不應該加載這樣的按鈕內部的文件,我建議你創建一個文件讀入一個隊列,一個過程,當用戶按下按鈕,你讀了一個排隊的項目並顯示給用戶,如:

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

您可以用下面的方法來創建一個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異步,而不是同步,以便不阻止用戶界面線。