2012-04-23 2 views
29

ComboBox의 자식 컨트롤을 WPF의 MyContainerGrid에 어떻게 가져올 수 있습니까?유형별로 WPF 컨테이너의 하위 항목을 가져 오는 방법은 무엇입니까?

<Grid x:Name="MyContainer">      
    <Label Content="Name" Name="label1" /> 
    <Label Content="State" Name="label2" /> 
    <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox1"/> 
    <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox3" /> 
    <ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox4" /> 
</Grid> 

이 줄은 나에게 오류를 제공합니다

var myCombobox = this.MyContainer.Children.GetType(ComboBox); 

답변

63

이 확장 방법은의 자식 요소에 대한 재귀 적으로 검색합니다 원하는 유형 :

public static T GetChildOfType<T>(this DependencyObject depObj) 
    where T : DependencyObject 
{ 
    if (depObj == null) return null; 

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

     var result = (child as T) ?? GetChildOfType<T>(child); 
     if (result != null) return result; 
    } 
    return null; 
} 

이렇게 사용하면 MyContainer.GetChildOfType<ComboBox>()을 요청할 수 있습니다.

+7

에서 검색하지 않습니다. LogicalTreeHelper.FindLogicalNode (DependencyObject depObj, string elementName) '가 동일한 목표를 달성하는 데 효과적입니다. – Paul

+0

이 항목을 사용하십시오 http://stackoverflow.com/a/978352/690656 – Andreas

32

어린이 UiElements의 모음입니다. 따라서 항목을 반복하고 각 항목에 대해 필수 유형인지 여부를 결정해야합니다. , 귀하의 경우 요소만을

var comboBoxes = this.MyContainer.Children.OfType<ComboBox>(); 

이 방법은, 자신의 유형과 수익률을 기반으로 컬렉션을 필터링 : 다행히도, 편리 Extension Method 구문을 사용하여 호출 할 수 있습니다 정확히 이것에 대한 Linq는 방법, 즉 Enumerable.OfType<T> 이미 존재 유형은 ComboBox입니다.

만 (당신의 변수 이름이 암시 하듯이) 최초의 콤보를 원하는 경우에, 당신은 단지 쿼리에 FirstOrDefault()에 대한 호출을 추가 할 수 있습니다 :

var myComboBox = this.MyContainer.Children.OfType<ComboBox>().FirstOrDefault(); 
+0

이 잘 작동합니다. 감사합니다 – ArchieTiger

+1

이것은'ContentControl –

2
(화면) 소정의 지점을 포함하는 특정 유형의 제 아이

검색 :

(PARAM '지점'카메라 타입 선언 'PointToScreen'() 함수를 호출 한 결과 임)
private TDescendantType FindDescendant<TDescendantType>(DependencyObject parent, Point screenPoint) 
     where TDescendantType : DependencyObject 
{ 
    int count = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < count; i++) 
    { 
     var child = VisualTreeHelper.GetChild(parent, i); 
     if (child is Visual) 
     { 
      Point point = ((Visual)child).PointFromScreen(screenPoint); 
      Rect rect = VisualTreeHelper.GetDescendantBounds((Visual)child); 

      if (!rect.Contains(point)) 
       continue; 
     } 

     if (child is TDescendantType) 
     { 
      return (TDescendantType)child; 
     } 

     child = FindDescendant<TDescendantType>(child, screenPoint); 
     if (child != null) 
     { 
      return (TDescendantType)child; 
     } 
    } 
    return null; 
} 
+0

자세한 정보를 원하면 [편집]하십시오. 코드 전용 및 "시도하십시오"답변은 검색 가능한 콘텐츠가 없기 때문에 [낙담]됩니다 (// meta.stackexchange.com/questions/196187). 왜 누군가가 "시도해"야하는지 설명하지 않습니다. 우리는 여기서 지식을위한 자원이되기 위해 노력합니다. – Mogsdad

관련 문제