【问题标题】:Implementing ReadKey() on a TextReader在 TextReader 上实现 ReadKey()
【发布时间】:2013-08-15 13:32:04
【问题描述】:

我有一个通过 TextReader 接受输入的类,并允许该类从控制台或文本框接收输入。

以下是我正在尝试做的一个非常基本的示例:

using System.IO;

class TestReader()
{
    public TextReader CurrentStream { get; }

    public void SetInputStream( TextReader reader)
    {
        Reader = reader;
    }
}

class Program
{
    static void Main( string[] args )
    {
        TestReader rdr = new TestReader();
        rdr.SetInputStream(Console.In);

        var input = (char)rdr.CurrentStream.Read();

        Console.WriteLine( "You selected: " + input );

    }
}

如何更改上述内容以实现ReadKey(),因为上例中的Read() 方法在按下Enter 键之前一直接受输入?我想实现 ReadKey() 以便它只接受一个按键。

谢谢。

** 编辑 **

为了进一步澄清,我希望在不使用 Console.ReadKey() 的情况下实现 ReadKey()。我什至不确定这是否可能,因为 Google 到目前为止还没有提供任何信息。

【问题讨论】:

  • 你不能因为文本阅读器是一个字符流,但是一个键(或组合键)可能不是一个字符。
  • @DarrenKopp:那么ReadKey() 是如何做到的呢?现在看来,我将不得不在不使用 Console.ReadKey() 的情况下实现我自己的 ReadKey() 方法。
  • ReadKey 有效,因为它正在拦截键盘按键事件。

标签: c# textreader


【解决方案1】:

我用过

     ConsoleKeyInfo info;
     do
     {
        info = Console.ReadKey();
     } while (info.KeyChar != '\n' &&
        info.KeyChar != '\r'); 

循环直到我按下回车

如果您只有输入流或textBox,您可以执行if 语句。在控制台的情况下使用我的示例,在textBox 的情况下阅读它的文本

【讨论】:

  • 该代码不起作用,因为您在示例中引用了 Console 类。我不想让班级知道任何关于 ConsoleTextBox 实现的信息,因为这些应该由调用应用程序提供,无论是控制台还是 Winforms 应用程序。
  • @MikeClarke textBox 可以发送它的文本,Console 可以使用我给你的代码并发送它得到的文本,那么为什么不使用 SetInputStream 来接收字符串呢?
  • 问题是 TextReader 类没有实现 ReadKey() 方法,在您的示例中,您直接使用 Console 类,这在 Winforms 中不起作用应用程序。
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 2013-04-11
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多