c# – 如何迭代LibraryStack中的元素?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何迭代LibraryStack中的元素?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2504字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何迭代LibraryStack中的元素?](/upload/InfoBanner/zyjiaocheng/775/8b9ef4e1efd84239a721762924851c44.jpg)
我有一个LibraryStack的以下定义:
<s:LibraryStack Name="TaggingContainer" Margin="20" Grid.Row="1" Grid.ColumnSpan="2" AllowDrop="True" Height="300" Width="300" s:SurfaceDragDrop.DragLeave="TaggingContainer_DragLeave" s:SurfaceDragDrop.DragEnter="TaggingContainer_DragEnter" s:SurfaceDragDrop.PreviewDrop="LibraryStack_PreviewDrop">
<s:LibraryStack.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Name}" Tag="{Binding}" FontSize="20" Margin="10,10,10,10" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" Background="#c49b14" BorderBrush="White" BorderThickness="2" s:Contacts.PreviewContactDown="Label_PreviewContactDown"></Label>
</DataTemplate>
</s:LibraryStack.ItemTemplate>
</s:LibraryStack>
现在在代码隐藏中,我想迭代LibraryStack中包含的所有标签(数据模板中定义的标签).
但是,如果我使用
foreach (FrameworkElement element in TaggingContainer.Items) {
}
我遍历TaggingContainer中的数据对象而不是Datatemplates.我怎么能改变呢?
解决方法:
最简单的方法可能是在Visual Tree中的LibraryStack下找到每个LibraryStackItem或Label.试试这个
private void SomeMethod()
{
// Get All Labels
List<Label> labels = GetVisualChildCollection<Label>(TaggingContainer);
foreach (Label label in labels)
{
//...
}
}
或者,您可以获取每个元素的容器,并以此方式获取Label
foreach (var element in TaggingContainer.Items)
{
LibraryStackItem libraryStackItem = TaggingContainer.ItemContainerGenerator.ContainerFromItem(element) as LibraryStackItem;
Label label = VisualTreeHelpers.GetVisualChild<Label>(libraryStackItem);
}
GetVisualChild
private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
GetVisualChildCollection
public static List<T> GetVisualChildCollection<T>(object parent) where T : Visual
{
List<T> visualCollection = new List<T>();
GetVisualChildCollection(parent as DependencyObject, visualCollection);
return visualCollection;
}
private static void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is T)
{
visualCollection.Add(child as T);
}
else if (child != null)
{
GetVisualChildCollection(child, visualCollection);
}
}
}
内容总结
以上是互联网集市为您收集整理的c# – 如何迭代LibraryStack中的元素?全部内容,希望文章能够帮你解决c# – 如何迭代LibraryStack中的元素?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。