在WPF中,在画布上获取下一个同级( Package )的最简单方法是什么?

gijlo24d  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(102)

我们有一个画布,其中有一个儿童集合与索引器。我们提到了其中一个孩子。我们只想得到列表中的下一个孩子,如果我们过了最后,我们想再绕一圈。
我们目前正在通过循环来获得我们所拥有的索引,然后我们递增,检查边界并在必要时 Package ,然后使用该结果从索引器中获取子对象。
……但我觉得这是三个左向右。我肯定漏掉了什么。
注意:如果有一个通用的解决方案用于任何基于索引的集合,那将是很好的,但即使它只是特定于画布的,那也是很好的。

fivyi3re

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;
    }
}

这将打印以下内容:
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,并导航不同的轴。

kxxlusnw

kxxlusnw2#

您可能不应该直接使用画布,而应该使用ItemsControl和画布ItemsPanel。您也可以在项目顶部使用CollectionView,这允许您获得并移动CurrentItemMoveCurrentTo*)。

相关问题