C# 查找ItemsControl-WPF中的所有控件
我需要做动画与一个或多个网格是目前在SDE项目控制。我的项控件类似于C# 查找ItemsControl-WPF中的所有控件,c#,wpf,wpf-controls,itemscontrol,stackpanel,C#,Wpf,Wpf Controls,Itemscontrol,Stackpanel,我需要做动画与一个或多个网格是目前在SDE项目控制。我的项控件类似于 <StackPanel x:Name="SlideMainContent" Orientation="Vertical"> <ItemsControl Name="itemControls"> <ItemsControl.ItemTemplate> <DataTemplate>
<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>
但我可以得到所有的网格 您可以使用VisualTreeHelper进行此操作 将此方法插入代码隐藏:
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;
}
公共静态T FindChild(DependencyObject父对象),其中T:DependencyObject
{
如果(父项!=null)
{
for(int i=0;i
这将有助于找到您指定类型的第一个子控件。您可以在foreach循环中使用它,如下所示:
itemControls.UpdateLayout();
foreach(var item in itemControls.Items)
{
var parentObject = item.ItemContainerGenerator.ContainerFromItem(item);
Grid grid = FindChild<Grid>(parentObject);
... your code here ...
}
itemControls.UpdateLayout();
foreach(itemControls.Items中的var项)
{
var parentObject=item.ItemContainerGenerator.ContainerFromItem(item);
Grid Grid=FindChild(parentObject);
…你的代码在这里。。。
}
您可以使用VisualTreeHelper进行此操作
将此方法插入代码隐藏:
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;
}
公共静态T FindChild(DependencyObject父对象),其中T:DependencyObject
{
如果(父项!=null)
{
for(int i=0;i
这将有助于找到您指定类型的第一个子控件。您可以在foreach循环中使用它,如下所示:
itemControls.UpdateLayout();
foreach(var item in itemControls.Items)
{
var parentObject = item.ItemContainerGenerator.ContainerFromItem(item);
Grid grid = FindChild<Grid>(parentObject);
... your code here ...
}
itemControls.UpdateLayout();
foreach(itemControls.Items中的var项)
{
var parentObject=item.ItemContainerGenerator.ContainerFromItem(item);
Grid Grid=FindChild(parentObject);
…你的代码在这里。。。
}
以下是一个扩展方法,用于查找特定类型的所有子项:
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;
}
公共静态列表GetChildrenOfType(此DependencyObject depObj)
其中T:DependencyObject
{
var result=新列表();
if(depObj==null)返回null;
var queue=新队列();
排队。排队(depObj);
而(queue.Count>0)
{
var currentElement=queue.Dequeue();
var childrenCount=visualtreeheloper.GetChildrenCount(currentElement);
对于(变量i=0;i
可能的用途:
someItemsControl.GetChildrenOfType<FrameworkElements>();
someItemsControl.GetChildrenOfType();
以下是一个扩展方法,用于查找特定类型的所有子项:
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;
}
公共静态列表GetChildrenOfType(此DependencyObject depObj)
其中T:DependencyObject
{
var result=新列表();
if(depObj==null)返回null;
var queue=新队列();
排队。排队(depObj);
而(queue.Count>0)
{
var currentElement=queue.Dequeue();
var childrenCount=visualtreeheloper.GetChildrenCount(currentElement);
对于(变量i=0;i
可能的用途:
someItemsControl.GetChildrenOfType<FrameworkElements>();
someItemsControl.GetChildrenOfType();
为什么要这样做?请解释一下你真正想要实现的目标。我想用所有的网格来制作我的动画。这能回答你的问题吗?你为什么要这么做?请解释一下你真正想要实现的目标。我想用所有的网格来制作我的动画。这能回答你的问题吗?