Я мог бы что-то упустить, но я думаю, что то, что вы хотите, может быть легко достигнуто, скажем, у меня есть некоторый XAML, подобный этому
<Canvas x:Name="canv">
<Rectangle x:Name="canvChild1"/>
<Rectangle x:Name="canvChild2"/>
<Rectangle x:Name="canvChild3"/>
<Rectangle x:Name="canvChild4"/>
</Canvas>
Тогда все, что вам нужно, это получить безопасный индекс (то есть тот, который упакован), поэтому, если у меня есть дескриптор 1-го элемента и я хочу получить следующий, а затем 4-й и хочет получить следующий, я мог бы использовать код как это
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
Я думаю, вы могли бы также использовать отличные вещи LINQ to Tree от Colin Eberhardts, которые позволили бы вам использовать LINQ против визуального дерева: http://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree
Это довольно удобный материал, который позволяет вам обращаться с VisualTree так же, как с XML, и перемещаться по другой оси.