我有一个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的集合类型(后进先出)
但是我开始对Navigate Forward功能如何在VS中起作用感到困惑,或者如果我可以重新考虑它,那么理想情况下应该可行。那是我的头开始疼的时候。
如果用户访问了以下节点
,该怎么办?1,2,3,4
然后按回两次以进入节点2
然后点击节点5.
此时前进按钮是否应启用/可用?请描述使用的算法和数据结构。如果你正在使用筹码,一旦你“回去”,你就会失去你来自的地方。
那么如何实现对应的Navigate Forward功能呢?我一直在做的所有Google搜索都在编写与浏览器相关的网页应用编码技巧,我正在寻找一个方向,以避免错误发明已经完成的常见算法。
您的想法会受到欢迎。
答案 0 :(得分: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;
}
}