0

I need to do animation with one or many grid which is present inisde ItemsControl. My ItemsControl is like,

<StackPanel  x:Name="SlideMainContent" Orientation="Vertical">
          <ItemsControl Name="itemControls">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Tag="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource Mode=TemplatedParent}, FallbackValue=FAIL, StringFormat={}grid{0}}" Width="{Binding ActualWidth, ElementName=SlideMainViewer}"
                              Height="{Binding ElementName=SlideMainViewer, Path=ActualHeight}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height=".3*" />
                                <RowDefinition Height="auto"/>
                                <RowDefinition Height="auto" />
                                <RowDefinition Height="*" />
                                <RowDefinition Height=".3*" />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width=".2*"/>
                                <ColumnDefinition Width="2*" />
                            </Grid.ColumnDefinitions>
                            <Border Grid.Row="1" Grid.RowSpan="3" VerticalAlignment="Top"  Grid.Column="0" BorderThickness="5" BorderBrush="White">
                                <Image Stretch="Uniform" Source="{Binding Path=ImageURL}"/>
                            </Border>
                            <TextBlock  Grid.Row="1" Grid.Column="2" FontFamily="{StaticResource AvenirLT65}" Style="{StaticResource HeaderStyle}" Text="{Binding (ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=StackPanel}}" />
                            <TextBlock Grid.Row="2" Grid.Column="2" FontFamily="{StaticResource AvenirLT65}"  Style="{StaticResource SubHeaderStyle}" Margin="0 10" Text="{Binding Path=NewsDate}" />
                            <TextBlock Grid.Row="3" Grid.Column="2" FontFamily="{StaticResource AvenirLT35}" Style="{StaticResource TextStyle}" Text="{Binding Path=Description}" />
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
  </StackPanel>

Here I want to use get all the grid panels for my animation like,

 foreach (Grid grd in SlideMainContent.Children)
 {
    // my code comes here.....
 }

But I could get all grid.

ganesh
  • 859
  • 6
  • 13
  • 29
  • 1
    Why would you want to do that? Please explain what you're actually trying to achieve. – Clemens Dec 07 '16 at 09:27
  • I want to use all the grid for my animation. – ganesh Dec 07 '16 at 09:29
  • Does this answer your question? [How do I access the children of an ItemsControl?](https://stackoverflow.com/questions/1000345/how-do-i-access-the-children-of-an-itemscontrol) – StayOnTarget Apr 22 '20 at 12:42

2 Answers2

3

Here is an extension method to find all children of a specific type:

    public static List<T> GetChildrenOfType<T>(this DependencyObject depObj)
    where T : DependencyObject
    {
        var result = new List<T>();
        if (depObj == null) return null;
        var queue = new Queue<DependencyObject>();
        queue.Enqueue(depObj);
        while (queue.Count > 0)
        {
            var currentElement = queue.Dequeue();
            var childrenCount = VisualTreeHelper.GetChildrenCount(currentElement);
            for (var i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(currentElement, i);
                if (child is T)
                    result.Add(child as T);
                queue.Enqueue(child);
            }
        }

        return result;
    }

possible usage:

someItemsControl.GetChildrenOfType<FrameworkElements>();
Ilan
  • 2,762
  • 1
  • 13
  • 24
1

You could use VisualTreeHelper for this.

Insert this method into your code-behind:

public static T FindChild<T>(DependencyObject parent) where T : DependencyObject
    {
        if (parent != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(parent, i);
                if (child != null && child is T)
                {
                    return (T) child;
                }

                T childItem = FindChild<T>(child);
                if (childItem != null)
                {
                    return childItem;
                }
            }
        }
        return null;
    }

That will help find first child control of the type you give it. You can use it in your foreach cycle as follows:

itemControls.UpdateLayout();
foreach(var item in itemControls.Items)
{
    var parentObject = item.ItemContainerGenerator.ContainerFromItem(item);
    Grid grid = FindChild<Grid>(parentObject);
    ... your code here ...
}