c# - Console.Clear()不要清除其他方法的文本

时间:2017-07-21 13:57:06

标签: c#

我在控制台中制作简单的PRG。 在我的MenuSystem Console.Clear()中,我们不会清除其他方法中的文字。 有什么想法吗?

class MenuSystem
{
    public static void Controll(int count, List<String> texts)
    {
        Console.Clear();
        int index = 0;
        bool isEnter = false;
        Write(0, texts);

        while (!isEnter)
        {
            ConsoleKey key = Console.ReadKey().Key;
            switch (key)
            {
                case ConsoleKey.UpArrow:
                    index -= 1;
                    break;
                case ConsoleKey.DownArrow:
                    index += 1;
                    break;
            }

            if (index > (count - 1))
                index = 0;
            else if (index < 0)
                index = count - 1;

            Write(index, texts);
        }
    }

    private static void Write(int index, List<String> texts)
    {
        Console.Clear();
        texts[index] = "[ " + texts[index] + " ]";

        foreach (String text in texts)
        {
            Console.WriteLine(text);
        }
    }

Write()中的Console.Clear()无法清除控制台。

3 个答案:

答案 0 :(得分:0)

这实际上是对您的问题的回答,但仅仅证明您发布的代码确实有效。

private static void Main()
{
    Console.Write("Some Text");           
    Console.Read(); //Console shows Show Text 
    MenuSystem.Controll(1, new List<string>() { "string" });
    Console.Read(); //Console shows string
}

...
class MenuSystem
{
    public static void Controll(int count, List<String> texts)
    {
        Write(count, texts);
    }

    private static void Write(int index, List<String> texts) //I don't know why you are passing index as it is never used here.
    {
        Console.Clear(); //Console is now cleared

        foreach (String text in texts)
        {
            Console.WriteLine(text); 
        }
    }
}

由于您提供的代码正在运行,我只能假设您的完整代码中存在导致问题的其他逻辑。

请使用展示您问题的代码更新您的问题。

答案 1 :(得分:0)

这个例子远非完美,但你会感觉到使用Console.Clear()

class Program
{
    static void DrawPlayer(int x, int y)
    {
        for (int i = 0; i < y; i++)
            Console.WriteLine();
        for (int j = 0; j < x; j++)
            Console.Write(' ');
        Console.Write("\u25A0");
    }

    static void Main()
    {
        int playerX = 0, playerY = 0;
        while (true)
        {
            DrawPlayer(playerX, playerY);
            var keyInfo = Console.ReadKey(true);
            switch (keyInfo.Key)
            {
                case ConsoleKey.W:
                    playerY--;
                    break;
                case ConsoleKey.A:
                    playerX--;
                    break;
                case ConsoleKey.S:
                    playerY++;
                    break;
                case ConsoleKey.D:
                    playerX++;
                    break;
            }
            Console.Clear();
        }
    }
}

答案 2 :(得分:0)

我认为您遇到的问题不在于Console.Clear(其目的是清除屏幕,而不是&#34;来自其他人的明文方法&#34; 如你所知。

问题是你要修改数组中的元素,然后在不修改前一个元素的情况下修改数组中的新元素。如果您想使用当前方法解决此问题,则需要跟踪先前在类级变量中修改的项目,以便在用户更改选择时取消修改它。

但是,我建议采用不同的方法。您应该只更改显示信息的方式,而不是信息本身,而不是修改列表中的字符串。

因此,在应用您的逻辑来检测要选择的索引之后,您只需遍历菜单项并将它们写入屏幕,当您到达所选项目的索引时,您可以编写&#34; [&#34;和&#34;]&#34;周围的人物。对于其他菜单项,您应该用空格字符围绕它们,这样当选择发生变化时,它们就不会在整个地方移动。

请注意,我还做了一个小改动,让菜单水平显示:

class MenuSystem
{
    public static void Control(List<string> menuItems)
    {
        var selectedIndex = 0;
        var exitMenu = false;

        while (!exitMenu)
        {
            DisplayMenu(selectedIndex, menuItems);

            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.LeftArrow:
                    selectedIndex -= 1;
                    if (selectedIndex < 0) selectedIndex = menuItems.Count - 1;
                    break;
                case ConsoleKey.RightArrow:
                    selectedIndex += 1;
                    if (selectedIndex > menuItems.Count - 1) selectedIndex = 0;
                    break;
                case ConsoleKey.Enter:
                    exitMenu = true;
                    break;
            }
        }
    }

    private static void DisplayMenu(int selectedIndex, List<string> menuItems)
    {
        Console.Clear();

        for (int i = 0; i < menuItems.Count; i++)
        {
            if (i == selectedIndex)
            {
                Console.Write("[" + menuItems[i] + "]");
            }
            else
            {
                Console.Write(" " + menuItems[i] + " ");
            }

            Console.Write("  ");
        }
    }
}