在WPF中在画布上获取下一个兄弟(包装)的最简单方法是什么?

时间:2012-01-27 11:25:45

标签: wpf collections wpf-controls children next

我们有一个带有索引器的Children集合的画布。我们提到了其中一个孩子。我们只想让列表中的下一个孩子,如果我们过了结束,我们想再次回头。

我们目前正在通过循环来获取我们所拥有的索引,然后我们增加它,检查边界并在必要时换行,然后使用该结果从索引器中获取子...

......但这对我来说只是三个左右。我不得不遗漏一些东西。

注意:如果有任何基于索引的集合的通用解决方案,那就太棒了,但即使它只是特定于画布,也没关系。

2 个答案:

答案 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,这样您就可以获得并移动CurrentItemMoveCurrentTo*)。