我们有一个带有索引器的Children集合的画布。我们提到了其中一个孩子。我们只想让列表中的下一个孩子,如果我们过了结束,我们想再次回头。
我们目前正在通过循环来获取我们所拥有的索引,然后我们增加它,检查边界并在必要时换行,然后使用该结果从索引器中获取子...
......但这对我来说只是三个左右。我不得不遗漏一些东西。
注意:如果有任何基于索引的集合的通用解决方案,那就太棒了,但即使它只是特定于画布,也没关系。
答案 0 :(得分:1)
我可能会遗漏一些东西,但我认为你想要的东西很容易实现,比如我有一些像这样的XAML
<Canvas x:Name="canv">
<Rectangle x:Name="canvChild1"/>
<Rectangle x:Name="canvChild2"/>
<Rectangle x:Name="canvChild3"/>
<Rectangle x:Name="canvChild4"/>
</Canvas>
然后您需要的是获取一个安全索引(即一个包装的索引),所以假设我有一个第一个元素的句柄,并想要抓住下一个,然后第四个想要抓住下一个,我可以使用代码像这样
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Debug.WriteLine(GetSafeElementForIndex(
this.canv.Children.IndexOf(canvChild1)).Name);
Debug.WriteLine(GetSafeElementForIndex(
this.canv.Children.IndexOf(canvChild4)).Name);
}
private FrameworkElement GetSafeElementForIndex(int currentIndex)
{
return (FrameworkElement)this.canv.Children[WrappedIndex(++currentIndex)];
}
private int WrappedIndex(int currentIndex)
{
return currentIndex % this.canv.Children.Count;
}
}
这打印出来:
canvChild2
canvChild1
我认为您也可以使用Colin Eberhardts出色的LINQ to Tree内容,这样您就可以使用LINQ来对抗Visual Tree:http://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree
这是非常方便的东西,它允许您像处理XML一样处理VisualTree,并导航不同的轴。
答案 1 :(得分:0)
您可能不应该直接使用画布,而是使用画布ItemsControl
作为ItemsPanel
。您还可以在项目的顶部使用CollectionView
,这样您就可以获得并移动CurrentItem
(MoveCurrentTo*
)。