3

我有一个 WinForm 应用程序,其中有一个 TreeView 控件,通常有很多节点,我想实现 Visual Studio 的 Navigate Back 和 Navigate forward 功能等功能。

我的直觉反应是使用此处描述的堆栈数据结构(http://social.msdn.microsoft.com/Forums/vstudio/en-US/2771e9b7-115d-4d10-8b31-12a2497a7724/how-go-back- button-in-the-windows-works-),我在这里复制:

使用 Stack 类来存储每个访问过的节点。当用户点击一个节点时,调用 Push 方法来聚集 url。当您需要返回调用 Stack 类上的 Pop 方法时,它将为您提供最后访问的节点,如果您再次调用它,它将为您提供之前的节点并以这种方式继续。ps:Stack类是LIFO的集合类型(后进先出)

但是我开始对导航前进功能在 VS 中的工作方式感到困惑,或者如果我可以重新考虑它是否应该在理想情况下工作。那是我的头开始疼的时候。

如果用户访问了以下节点怎么办

1,2,3,4

然后点击 Back 两次以到达节点 2

然后单击节点 5。

此时是否应该启用/使用前进按钮?请描述所使用的算法和数据结构。如果您使用的是堆栈,一旦您“返回”,您就会失去原来的位置。

那么如何实现对应的 Navigate Forward 功能呢?我一直在做的所有谷歌搜索都是打开与浏览器相关的 Web 应用程序编码技巧,我正在寻找一个方向以避免错误地发明一个已经完成的通用算法。

您的想法将受到欢迎。

4

1 回答 1

2

只是一个例子。不确定这是否是您需要的。当然,您也可以从节点 1 开始。您还可以在数组中的特定位置插入新值,并将其他值向上移动到数组中。

static void Main(string[] args)
        {
            string[] myValues = new[] { "1", "2", "3", "4" };
            Stack back = new Stack();
            Stack forward = new Stack();
            int maxPos = myValues.Length - 1;
            int minPos = 0;
            int currPos = myValues.Length - 1;
            Console.WriteLine("Initial Navigation Values {0}", string.Join(",", myValues));
            Console.WriteLine("User <- or -> keys to navigate between the values");
            Console.WriteLine("You are on Node 4");
            var key = Console.ReadKey().Key;
            while (key == ConsoleKey.LeftArrow || key == ConsoleKey.RightArrow)
            {
                if (currPos == minPos && key == ConsoleKey.LeftArrow)
                {
                    Console.WriteLine("You cannot navigate back anymore");
                    key = Console.ReadKey().Key;
                    continue;
                }
                if (currPos == maxPos && key == ConsoleKey.RightArrow)
                {
                    Console.WriteLine("You cannot navigate forward anymore");
                    key = Console.ReadKey().Key;
                    continue;
                }
                if (key == ConsoleKey.LeftArrow)
                {
                    forward.Push(myValues[currPos]);
                    currPos -= 1;
                }
                if (key == ConsoleKey.RightArrow)
                {
                    back.Push(forward.Pop());
                    currPos += 1;
                }
                Console.WriteLine("You are on Node {0}", myValues[currPos]);
                key = Console.ReadKey().Key;
            }
        }
于 2013-07-27T07:36:25.960 回答