2012-03-26 30 views
3

ボタン、ラベル、テキストボックスなどを含むwpf 4.0のUserControlがあります。 私はこれらのコントロールをループしたいと思います。ブートンを取得するときは、それを私のリストに保存してください。基本的に、私がしたいのは、UserControl内のすべてのボタンのNames_listを作成することです。VisualTreeHelperのユーザーコントロール内のコントロールを参照してください

私はすべてのコントロールを反復処理する方法を持っており、それがボタンを見つけた場合、それが名前だセーブ - 私は常に空のリストを取得

public void EnumVisual(Visual myVisual) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++) 
     { 
      // Retrieve child visual at specified index value. 
      Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i); 

      Button _button = childVisual as Button; 
      if (_button != null) 
      { 
       Class_Button _newButtonClass = new Class_Button(); 
       if (_button.Name != null) 
       { 
        _newButtonClass.ButtonName = _button.Name; 
       } 
       ButtonsList.Add(_newButtonClass); 
      } 

      // Enumerate children of the child visual object. 
      EnumVisual(childVisual); 

     } 
    } 

。 私はコードをデバッグして入力し、私のUserControlのVisualTreeを見ると、すべてのパネルとグループボックスとグリッドが表示されますが、ボタン、ラベル、 :FieldModifier = "public"。これは非常に奇妙です....そして、私はこの問題を解決する方法と同様にその理由を理解することはできません... 誰かが私が間違っていると言うことができますか? おかげ

+1

いつEnumVisual()を呼び出していますか?その時点でテンプレートが適用されていますか? – GazTheDestroyer

+0

@ GazTheDestroyer UserControlを含むMainWindowを作成し、表示された後にmenuItem .....をクリックしてボタンリストを取得する関数を呼び出し、その時点でMainWindow内のUserControlを見ることができます。 –

+0

UserControlが既に読み込まれているとは限りません。コードがそのメソッドに入る時点で、プロセスの途中にある可能性があります。いくつかの一時的なボタンのクリックイベントハンドラでそのメソッドを呼び出してみてください。 – EvAlex

答えて

0

は、あなたのコントロールのビジュアルツリーを調べることSnoop またはWPF Inspector のようなツールを使用することができます。 これらのツールがそうすることができれば、エラーはコードのどこかにあるはずですか?

1

@GazTheDestroyerで提案されているように、VisualTreeHelperを使用する前にコントロールテンプレートが適用されていることを確認する必要があります。お試しください:

public void EnumVisual(Visual myVisual) 
{ 
    if(myVisual is FrameworkElement) 
     ((FrameworkElement)myVisual).ApplyTemplate(); 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++) 
    { 
     // Retrieve child visual at specified index value. 
     Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i); 

     Button _button = childVisual as Button; 
     if (_button != null) 
     { 
      Class_Button _newButtonClass = new Class_Button(); 
      if (_button.Name != null) 
      { 
       _newButtonClass.ButtonName = _button.Name; 
      } 
      ButtonsList.Add(_newButtonClass); 
     } 

     // Enumerate children of the child visual object. 
     EnumVisual(childVisual); 

    } 
} 
関連する問題