45

WPFでタイプComboBoxの子コントロールを取得するにはどうすればよいですか?MyContainer Grid

<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);
4

6 に答える 6

94

この拡張メソッドは、目的のタイプの子要素を再帰的に検索します。

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>()

于 2012-04-23T10:56:09.143 に答える
45

Children は UIElements のコレクションです。したがって、アイテムを繰り返し処理し、各アイテムが必要なタイプであるかどうかを判断する必要があります。幸いなことに、まさにこれのための Linq メソッド、つまり が既にあり、拡張メソッド構文Enumerable.OfType<T>を使用して簡単に呼び出すことができます。

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

このメソッドは、タイプに基づいてコレクションをフィルタリングし、あなたの場合は type の要素のみを返しますComboBox

最初の ComboBox のみが必要な場合 (変数名が示すように)、FirstOrDefault()クエリに 呼び出しを追加するだけです。

var myComboBox = this.MyContainer.Children.OfType<ComboBox>().FirstOrDefault();
于 2012-04-23T10:52:01.747 に答える
2

(Screen の) 所定のポイントを含む特定のタイプの最初の子を検索します。

(param 'point' は 'PointToScreen' 関数を呼び出した結果です (Visual 型で宣言) )

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;
}
于 2016-03-29T15:42:57.103 に答える