2016-11-18 12 views
1

UWPプロジェクトのMainWindowのすべてのコントロールを何とかループする必要があります。 私の最初の考えは、私の窓に簡単なforeachになるということでした。コントロール。これはUWPには存在しません。ウィンドウ上のテキストボックスコントロールをクリアする

私は拾い読みして同様の質問hereを見つけましたが、このコードは試してみたときにも機能しなかったようです。それは、ウィンドウ全体を通してうまくループしました。見つかったオブジェクトが、グリッドなどを通っていることをはっきりと見ることができたとしても、まったく見つからなかったことがわかりました。

C#を使用してUWPでこれを行う方法はありますか?私はそれを行うVisualTreeHelperを検索しようとしましたが、どちらも成功しませんでした。どんな助けにも感謝!

+1

テキストボックスはどのように作成しますか?名前はついていますか?あなたはViewModelを持っていますか? 「クリア」とは、「テキストボックスのウィンドウをクリアする」ではなく、「テキストボックスのテキストをクリアする」ことを意味します(削除します)。あなたはどのようにそれらにアクセスしますか、そしてテキストを設定するために同じメカニズムを使用してみませんか? –

+0

私のプロジェクトのxamlにTextboxが宣言されています。私はそれぞれの名前を1つずつ付けましたが、その意図はテキストプロパティをクリアすることです。問題は、コードビハインドから前にアクセスしていないことです。すべてのテキストボックスが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; 
関連する問題