如何在 TreeView 中选择下一个/上一个 TreeViewItem?

发布于 2024-07-12 08:04:02 字数 393 浏览 10 评论 0原文

我有第一个/最后一个/上一个/下一个按钮,可以更改 TreeViewItem 的选定子节点。 将第一个和最后一个节点设置为选定的不是问题。 例如,要选择最后一个子节点:

TreeViewItem selectedItem = (myTreeView.SelectedItem as TreeViewItem);
TreeViewItem ParentItem = (selectedItem.Parent as TreeViewItem);
(ParentItem.Items[ParentItem.Items.Count - 1] as TreeViewItem).IsSelected = true;

将上一个/下一个项目设置为被选择的最简单/最优雅的方法是什么?

谢谢!

I have First/Last/Previous/Next buttons that change the selected child node of a TreeViewItem. Setting the First and Last node as selected is not a problem. For example, to select the last child node:

TreeViewItem selectedItem = (myTreeView.SelectedItem as TreeViewItem);
TreeViewItem ParentItem = (selectedItem.Parent as TreeViewItem);
(ParentItem.Items[ParentItem.Items.Count - 1] as TreeViewItem).IsSelected = true;

What would be the easiest/most elegant way to set the Previous/Next item as being selected?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

望她远 2024-07-19 08:04:02

您可以用 IndexOf 调用替换 for 循环。

int index = ParentItem.Items.IndexOf(MyTreeView.SelectedItem)

当然,最好检查一下 index + 1 是否是有效的集合索引。

对于前一个同级,它将是索引 - 1。

You could replace the for loop with a IndexOf call.

int index = ParentItem.Items.IndexOf(MyTreeView.SelectedItem)

And of course it will be good to check if index + 1 is a valid collection index.

And for the previous sibling it will be index - 1.

一梦浮鱼 2024-07-19 08:04:02

我的变体至少适用于 4 级树。

如果光标遇到最后一个树视图项目,它将从开始处开始。
如果您在第一个节点按“上一个”,您将停留在原地。

        // Button Back
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindPreviousItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }

    /// <summary>
    /// Get Previous Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindPreviousItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        var parentItem = (item.Parent as TreeViewItem);
        if (parentItem != null)
        {
            int index = parentItem.Items.IndexOf(item);
            if (index > 0 && index < parentItem.Items.Count)
            {
                return FindLastChildren((TreeViewItem)parentItem.Items[index - 1]);
            }
            else if (index == 0)
                return parentItem;
        }
        else return item;
        return foundedItem;
    }



    private static TreeViewItem FindLastChildren(TreeViewItem parent)
    {
        if (parent.Items.Count > 0)
        {
            return FindLastChildren((TreeViewItem)parent.Items.Last());
        }
        else return parent;
    }

    // вперед
    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindNextItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }


    /// <summary>
    /// Get Next Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindNextItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        if (item.Items.Count < 1)
        {
            var parentItem = (item.Parent as TreeViewItem);
            if (parentItem != null)
            {
                int index = parentItem.Items.IndexOf(item);
                if (index > 0 && index < parentItem.Items.Count - 1)
                {
                    return (TreeViewItem)parentItem.Items[index + 1];
                }
                else if (index == parentItem.Items.Count - 1)
                {
                    return FindFirstNextParent(parentItem);
                }
            }
            else return item;
        }
        return (TreeViewItem)item.Items[0];
    }

    private static TreeViewItem FindFirstNextParent(TreeViewItem parent)
    {
        var parentParent = ((TreeViewItem)parent).Parent;
        if (parentParent is TreeViewItem)
        {
            int pindex = ((TreeViewItem)parentParent).Items.IndexOf(parent);
            if ((pindex + 1) < ((TreeViewItem)parentParent).Items.Count)
                return ((TreeViewItem)((TreeViewItem)parentParent).Items[pindex + 1]);
            else
            {
                return FindFirstNextParent(((TreeViewItem)((TreeViewItem)parent).Parent));
            }
        }
        return parent;
    }

My variant works for me at least for 4-level tree.

If cursor meet last treeviewitem, it goes at start.
If you press Previous at first node, you stay in place.

        // Button Back
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindPreviousItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }

    /// <summary>
    /// Get Previous Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindPreviousItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        var parentItem = (item.Parent as TreeViewItem);
        if (parentItem != null)
        {
            int index = parentItem.Items.IndexOf(item);
            if (index > 0 && index < parentItem.Items.Count)
            {
                return FindLastChildren((TreeViewItem)parentItem.Items[index - 1]);
            }
            else if (index == 0)
                return parentItem;
        }
        else return item;
        return foundedItem;
    }



    private static TreeViewItem FindLastChildren(TreeViewItem parent)
    {
        if (parent.Items.Count > 0)
        {
            return FindLastChildren((TreeViewItem)parent.Items.Last());
        }
        else return parent;
    }

    // вперед
    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindNextItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }


    /// <summary>
    /// Get Next Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindNextItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        if (item.Items.Count < 1)
        {
            var parentItem = (item.Parent as TreeViewItem);
            if (parentItem != null)
            {
                int index = parentItem.Items.IndexOf(item);
                if (index > 0 && index < parentItem.Items.Count - 1)
                {
                    return (TreeViewItem)parentItem.Items[index + 1];
                }
                else if (index == parentItem.Items.Count - 1)
                {
                    return FindFirstNextParent(parentItem);
                }
            }
            else return item;
        }
        return (TreeViewItem)item.Items[0];
    }

    private static TreeViewItem FindFirstNextParent(TreeViewItem parent)
    {
        var parentParent = ((TreeViewItem)parent).Parent;
        if (parentParent is TreeViewItem)
        {
            int pindex = ((TreeViewItem)parentParent).Items.IndexOf(parent);
            if ((pindex + 1) < ((TreeViewItem)parentParent).Items.Count)
                return ((TreeViewItem)((TreeViewItem)parentParent).Items[pindex + 1]);
            else
            {
                return FindFirstNextParent(((TreeViewItem)((TreeViewItem)parent).Parent));
            }
        }
        return parent;
    }
初相遇 2024-07-19 08:04:02

它并不优雅,但很有效。 有人能想出更好的解决方案吗? (显示“下一步”功能)

int index = 0;
foreach (TreeViewItem i in ParentItem.Items) {
    if (i.Equals(MyTreeView.SelectedItem)) {
        break;
    }
    index++;
}
(ParentItem.Items[index + 1] as TreeViewItem).IsSelected = true;

It's not elegant, but it works. can anyone come up with a better solution? ("Next" functionality shown)

int index = 0;
foreach (TreeViewItem i in ParentItem.Items) {
    if (i.Equals(MyTreeView.SelectedItem)) {
        break;
    }
    index++;
}
(ParentItem.Items[index + 1] as TreeViewItem).IsSelected = true;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文