有没有办法显示文本而不设置光标位置

时间:2015-05-27 14:41:45

标签: c#

基本上,我想知道是否有办法在不设置光标位置的情况下显示文字

喜欢,如果我想在第5,7点显示'0'

我知道我能做到

Console.SetCursorPosition(5,7);
Console.Write("0");

但是我的光标需要我的程序中的其他东西。有没有办法在没有设置位置的情况下显示0?

非常感谢!

2 个答案:

答案 0 :(得分:4)

尝试捕获prev位置然后再次设置:

Console.WriteLine("abc");

var prevX = Console.CursorLeft;
var prevY = Console.CursorTop;

Console.SetCursorPosition(15, 17);
Console.Write("0");

Console.SetCursorPosition(prevX, prevY);

Console.ReadKey();

答案 1 :(得分:3)

您必须设置Console.Write的光标位置才能知道实际写入的位置。所以你无法避免使用SetCursorPosition。但是,您可以使用CursorLeftCursorTop获取当前位置,然后将其恢复(如Giorgi的答案)。

你可以用一个方便的方法将这一切包装起来:

public static void WriteAt(string s, int x, int y)
{
    // save the current position
    var origCol = Console.CursorLeft;
    var origRow = Console.CursorTop;
    // move to where you want to write
    Console.SetCursorPosition(x, y);
    Console.Write(s);
    // restore the previous position
    Console.SetCursorPosition(origCol, origRow);
}

您可以这样使用:

WriteAt("foo",5,15);

您甚至可以使用这样的扩展方法(遗憾的是,您无法向Console添加扩展名,因为它是一个静态类,但您可以将其添加到String!):

public static class StringConsoleHelper
{
    public static void WriteAt(this string s, int x, int y)
    {
        // save the current position
        var origCol = Console.CursorLeft;
        var origRow = Console.CursorTop;
        // move to where you want to write
        Console.SetCursorPosition(x, y);
        Console.Write(s);
        // restore the previous position
        Console.SetCursorPosition(origCol, origRow);
    }
}

所以现在你可以做类似的事情:

"foo".WriteAt(5,15);