我们有一个画布,其中有一个儿童集合与索引器。我们提到了其中一个孩子。我们只想得到列表中的下一个孩子,如果我们过了最后,我们想再绕一圈。我们目前正在通过循环来获得我们所拥有的索引,然后我们递增,检查边界并在必要时 Package ,然后使用该结果从索引器中获取子对象。……但我觉得这是三个左向右。我肯定漏掉了什么。注意:如果有一个通用的解决方案用于任何基于索引的集合,那将是很好的,但即使它只是特定于画布的,那也是很好的。
fivyi3re1#
我可能遗漏了一些东西,但我认为您想要的东西可以很容易地实现,比如说我有一些像这样的XAML
<Canvas x:Name="canv"> <Rectangle x:Name="canvChild1"/> <Rectangle x:Name="canvChild2"/> <Rectangle x:Name="canvChild3"/> <Rectangle x:Name="canvChild4"/> </Canvas>
然后,您需要的就是抓取一个安全的索引(即 Package 的索引),所以假设我有一个句柄,第一个元素,并且想要抓取下一个,然后第四个元素,并且想要抓取下一个,我可以使用这样的代码
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; } }
这将打印以下内容:canvChild2canvChild1我认为你也可以使用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,并导航不同的轴。
kxxlusnw2#
您可能不应该直接使用画布,而应该使用ItemsControl和画布ItemsPanel。您也可以在项目顶部使用CollectionView,这允许您获得并移动CurrentItem(MoveCurrentTo*)。
ItemsControl
ItemsPanel
CollectionView
CurrentItem
MoveCurrentTo*
2条答案
按热度按时间fivyi3re1#
我可能遗漏了一些东西,但我认为您想要的东西可以很容易地实现,比如说我有一些像这样的XAML
然后,您需要的就是抓取一个安全的索引(即 Package 的索引),所以假设我有一个句柄,第一个元素,并且想要抓取下一个,然后第四个元素,并且想要抓取下一个,我可以使用这样的代码
这将打印以下内容:
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,并导航不同的轴。
kxxlusnw2#
您可能不应该直接使用画布,而应该使用
ItemsControl
和画布ItemsPanel
。您也可以在项目顶部使用CollectionView
,这允许您获得并移动CurrentItem
(MoveCurrentTo*
)。