实时显示字符串值

时间:2014-01-08 20:44:55

标签: c# multithreading real-time

我正在编写控制台程序,我的代码如下所示:

Configuration.cs

public static class Configuration
{
    public static string Message = "";
}

Menu.cs

class Menu
{
    public static void showMenu()
    {
        Console.Clear();
        Console.WriteLine("1: SOMETHING");
        Console.WriteLine("2: SOMETHING");
        Console.WriteLine("3: SOMETHING");
        Console.WriteLine("SYSTEM MSG: " + Configuration.Message);
        Console.Write("INPUT: ");
    }
}

Program.cs的

...
static void Main(string[] args)
{
    ...
    int choice;

    while(true)
    {
        Menu.showMenu();
        choice = Convert.ToInt32(Console.ReadLine());

        switch(choice)
        {
            case 1:
            Configuration.Message = "HELLO!";
            break;

            case 2:
            Configuration.Message = "HI!";
            break;

            case 3:
            Configuration.Message = "WHAT?!";
            break;
        }
    }
}
...

现在,当我更改Configuration.Message时,它会显示在菜单上,因为showMenu方法会清除控制台并再次显示字符串。

但我想要的是没有Clear方法,我想实时显示Configuration.Message。我当时正在考虑使用Timer并每秒刷新菜单,但效率不高(感觉就像作弊)。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

当您写入Console时,写入操作从当前光标位置开始。所以......

查看System.Console类的属性和方法,特别是:

  • CursorLeft获取或设置光标的列位置
  • CursorTop获取或设置光标的行位置
  • SetCursorPosition( int left , int top )设置行和列位置。

在写入每个字符时,光标向右移动一个位置,当光标移过BufferWidth列时包裹到下一行(例如,如果您的控制台缓冲区为80列宽,则写入第80列将使列超出缓冲区(第81列),因此光标将移动到下一行的第1列。

对于您想要做的事情,您还可以查看P /调用本机Win32游标方法,或使用类似* nix的curses(3)和Gnu ncurses(3)的.Net派生之一:

答案 1 :(得分:3)

我建议如果这样的功能是必要的,那么看看像WPF这样的UI技术会更好。但是,话虽这么说,也许这会做你想要的。每次设置消息时显示菜单。我不认为在使用控制台时,有一种方法可以将变量绑定到控制台上的某些消息。

    public static class Configuration
    {
        private static string _message;
        public static string Message 
        { 
            get
            {
                return _message;
            }
            set
            {
                _message = value;
                Menu.showMenu();
            }
        }
    }

编辑:要使用属性更改事件来实现此功能,您可以执行以下操作。注意,我没有实现INotifyPropertyChanged以保持静态类。

class Program
    {
        static void Main(string[] args)
        {
            Configuration.PropertyChanged += (sender, e) =>
            {
                Menu.showMenu();
            };
            int choice;

            while (true)
            {
                Menu.showMenu();
                choice = Convert.ToInt32(Console.ReadLine());

                switch (choice)
                {
                    case 1:
                        Configuration.Message = "HELLO!";
                        break;

                    case 2:
                        Configuration.Message = "HI!";
                        break;

                    case 3:
                        Configuration.Message = "WHAT?!";
                        break;
                }
            }
        }
    }

    class Menu
    {
        public static void showMenu()
        {
            Console.Clear();
            Console.WriteLine("1: SOMETHING");
            Console.WriteLine("2: SOMETHING");
            Console.WriteLine("3: SOMETHING");
            Console.WriteLine("SYSTEM MSG: " + Configuration.Message);
            Console.Write("INPUT: ");
        }
    }

    public static class Configuration 
    {
        public static event PropertyChangedEventHandler PropertyChanged;

        private static string _message;
        public static string Message
        {
            get
            {
                return _message;
            }
            set
            {
                if (value != _message)
                {
                    _message = value;
                    NotifyPropertyChanged(property: _message);
                }
            }
        }

        private static void NotifyPropertyChanged(object property, String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(property, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

答案 2 :(得分:3)

当用户点击进入时显示菜单。

除了响应用户的输入之外,写入控制台不是一个好主意。这样做的原因是你可能会在控制台中间写入他们想要的行。然后他们的文本和退格键将变得不同步,用户将很难理解正在发生的事情。

我的建议是添加另一个选项,以便用户可以在没有选择的情况下点击ENTER,并且会在没有清除的情况下重新显示菜单。这样,用户只需按ENTER而不选择选项即可决定何时实时刷新。

如果您真的想要更实时的方法,并希望将其与用户输入混合使用,我建议控制台不是提供此解决方案的好方法。