【问题标题】:What's the easiest way to get the next sibling (wrapping) on a canvas in WPF?在 WPF 的画布上获取下一个兄弟(包装)的最简单方法是什么?
【发布时间】:2012-01-27 11:25:44
【问题描述】:

我们有一个带有索引器的 Children 集合的画布。我们提到了其中一个孩子。我们只想获取列表中的下一个子节点,如果超出末尾,我们想再次环绕。

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

...但这对我来说就是左三右右。我必须错过一些东西。

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

【问题讨论】:

    标签: wpf collections wpf-controls children next


    【解决方案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 东西,这将允许您针对 Visual Tree 使用 LINQ:http://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree

    这是非常方便的东西,它允许您像对待 XML 一样对待 VisualTree,并导航不同的轴。

    【讨论】:

    • 啊啊啊! 200 美元我不知道的事情,亚历克斯! “索引”!我知道我错过了一些简单的东西。我可以在 Linq 查询(甚至更好的扩展方法)中使用它来提供我想要的东西。 (这消除了我对循环查找的需要。)投票是你的(......欢迎来到 StackOverflow!我相信你的分数会很快上升。)
    • 顺便说一句,一个建议:发布代码时,您可以消除顶部的“使用”和类本身。你只需要相关的方法。另外,尝试删除双空行。所有这些都会导致不必要的水平和垂直滚动。不过,很棒的代码示例。简单明了!
    【解决方案2】:

    您可能不应该直接使用画布,而应该使用 ItemsControlItemsPanel 画布。您还可以在项目顶部使用CollectionView,这样您就可以获取和移动CurrentItem (MoveCurrentTo*)。

    【讨论】:

    • 嗯。有趣的思考,但不适用于我的问题。我的意思是 ItemsControl 给你什么来解决我关于获取集合中的下一个项目的问题?
    • @MarqueIV:ItemsControl 有点偏题了,你可能不需要它来与CollectionViews 一起工作,但是在集合和Canvas.
    猜你喜欢
    • 2010-10-22
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多