2016-11-18 79 views
1

我需要以某種方式遍歷UWP項目的MainWindow上的所有控件。 我的第一個想法是,它將是我window.Controls上的一個簡單的foreach,但這在UWP中不存在。窗口上的清除文本框控件

我周圍的瀏覽,發現了類似的問題here但是這個代碼似乎沒有工作,要麼當我嘗試了一下。它在整個窗口中成功循環,只是發現找到的對象根本沒有,儘管我可以清楚地看到它通過網格等。

有沒有辦法在使用C#的UWP中做到這一點?我試圖尋找一個VisualTreeHelper來做到這一點,但沒有成功。任何幫助感謝!

+1

如何創建文本框?他們是否被命名?你有ViewModel嗎? 「清除」的意思是「清除文本框中的文本」,而不是「清除文本框的窗口」(刪除它們),對吧?你如何訪問它們,爲什麼你不使用相同的機制來設置文本? –

+0

我在我的項目的xaml中聲明瞭Textboxes。我命名了它們中的每一個,目的是清除文本屬性。問題是我之前沒有從後面的代碼訪問它們,看到所有文本框如何從xmlDeserializer獲取它們的內容。 –

回答

2

您可以使用從MSDN documentation下面的方法來從頁面讓所有的文本框:

internal static void FindChildren<T>(List<T> results, DependencyObject startNode) 
    where T : DependencyObject 
{ 
    int count = VisualTreeHelper.GetChildrenCount(startNode); 
    for (int i = 0; i < count; i++) 
    { 
     DependencyObject current = VisualTreeHelper.GetChild(startNode, i); 
     if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T)))) 
     { 
      T asType = (T)current; 
      results.Add(asType); 
     } 
     FindChildren<T>(results, current); 
    } 
} 

它基本上遞歸獲得孩子的當前項目,並添加任何項目所請求的類型匹配的提供名單。

然後,你就必須做你頁面/按鈕處理程序下面的某個地方/ ...:

var allTextBoxes = new List<TextBox>(); 
FindChildren(allTextBoxes, this); 

foreach(var t in allTextBoxes) 
{ 
    t.Text = "Updated!"; 
} 
+0

完美的工作!我忘記了VisualTreeHelper StartNode是DependencyObject類型的。謝謝! –

0

對於視圖中的每個TextBox,簡單的方法就是TextBox.Text = String.Empty;

0

您可以使用下面的代碼來找到控制。

public static T FindChild<T>(DependencyObject depObj, string childName) 
     where T : DependencyObject 
    { 
     // Confirm parent and childName are valid. 
     if (depObj == null) return null; 

     // success case 
     if (depObj is T && ((FrameworkElement)depObj).Name == childName) 
      return depObj as T; 

     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 

      //DFS 
      T obj = FindChild<T>(child, childName); 

      if (obj != null) 
       return obj; 
     } 

     return null; 
    } 

,並可以清除文本框。

TextBox txtBox1= FindChild<TextBox>(this, "txtBox1"); 
     if (txtBox1!= null) 
      txtBox1.Text= String.Empty;