2010-04-23 3 views
4

아래 코드는 다른 색상의 선을 보여줍니다.
하지만 한 줄만 입력하고 프로그램 전체에서 다시 반복하는 코드가 많이 있습니다.
정확하게 이것을 어떻게 단순화 할 수 있습니까? 그래서 같은 양의 코드를 반복해서 작성해야합니까?콘솔의 색상을 사용하여 간단한 표기법으로 저장하는 방법

 Console.ForegroundColor = ConsoleColor.Cyan; 
     Console.Write(">>> Order: "); 
     Console.ResetColor(); 
     Console.Write("Data"); 
     Console.ForegroundColor = ConsoleColor.DarkGreen; 
     Console.Write("Parity"); 
     Console.ForegroundColor = ConsoleColor.Cyan; 
     Console.Write(" <<<"); 

저장 방법이 있습니까? = Console.ForegroundColor = ConsoleColor.Cyan; ?

"text"+ color? + "텍스트"; ...

아무 입력 감사합니다 안부.

답변

19

그것은 당신이 무슨 뜻인지 전혀 분명하지 않다,하지만 당신은 항상 도우미 메서드를 만들 수 있습니다

public static void ColoredConsoleWrite(ConsoleColor color, string text) 
{ 
    ConsoleColor originalColor = Console.ForegroundColor; 
    Console.ForegroundColor = color; 
    Console.Write(text); 
    Console.ForegroundColor = originalColor; 
} 
+0

단 하나의 색상이있는 선에 대해 쓸 코드가 많이 있습니다. 나는 이것을 단순화하는 방법을 궁금해했다. 그래서 모든 줄을 다시 한번 타이핑 할 필요없이 내 전체 프로그램을 통해 그 색상을 사용할 수있다. – Chris

+5

@Chris : 요점은 한 번만 해당 메서드를 작성한 다음 여러 번 호출해야한다는 것입니다. 아마도 프로그램 전체에 코드를 작성하는 방법을 보여 줄 수 있다면 도움이 될 것입니다. –

+1

Chris, 작성 방법 : ColoredConsoleWrite (Color.Red, "blah"); 너무 복잡하고/너무 길어? – rochal

0

여기 Visual Basic에서이기는하지만, 내 공헌의 : 다음과 같이

Sub WriteColor(ByRef part1 As String, ByRef part2 As String) 
    Console.Write(part1) 
    Console.ForegroundColor = ConsoleColor.Green 
    Console.WriteLine(part2) 
    Console.ResetColor() 
End Sub 

내가 위의 코드를 호출 :

초록색은 다른 모든 디버그 메시지 내에서 쿼리 결과를 선택할 수있게합니다. 내가 인쇄하는거야. 희망이 도움이됩니다. 분명히 다양한 인수를 허용하는 좀 더 일반적인 솔루션이 더 유용 할 수 있지만이 특정 코드조차도 반복을 피하고 삶을 편하게 만듭니다.

6

또 다른 아이디어는 ANSI escape codes과 같은 것을 포함하는 것입니다. 그러나 색상은 매우 작고 색상은 매우 작습니다.

그래서 BMP (Basic Multilingual Plane)의 Unicode Private Use Area (PUA) 섹션과 기본 파서/렌더러를 사용하여 출력 문자열에 색상 코드를 삽입하는 것이 좋습니다.

BTW 콘솔 색상 설정은 프로세스의 전역이므로 여러 스레드가 컬러 출력을 생성하는 경우 각 블록을 "색상 혼란"을 피하기 위해 중요 섹션으로 둘러 쌀 필요가 있습니다.

인라인을 넣기에는 약간 길기 때문에 내 사이트에 uploaded the sample source이 있습니다.

+0

링크 _http : //codehq.net/files/WriteColor.zip_을 (를) 찾을 수 없습니다. – Kiquenet

9

내 라이브러리 Edokan.KaiZen.Colors을 사용할 수 있습니다. 그것은 node.js를위한 색상 npm 모듈의 뻔뻔한 사본입니다.

몇 가지 문제가 있지만 작동합니다. 실제로 그것은 당신이 원하는 방식으로 작동합니다.

Console.WriteLine("INFO: ".Cyan().Bold() + " This is just a message"); 
+0

영감을 보내 주셔서 감사합니다. 나는이 API를 좋아한다! 내 라이브러리에 추가해야합니다. (내 대답은 아래 참조하십시오.) – Athari

2

우울하지만 단순한 해결책.

전경색 태그 시작 : <*color*>. 전경색 태그의 끝 : <*/*>. 배경색 태그 시작 : <*!color*>. 배경색 태그 끝 : <*/!*>.

사용 예 : 허용 색상의

WriteLineColor("<*!red*><*yellow*>Yellow text<*/*> and <*cyan*>cyan text<*/*> on red background.<*/!*>"); 

목록 (시스템.검은 색, 진한 파란색, 다크 그린, 다크 시안, 다크 레드, 다크 매젠타, 다크 옐로우, 그레이, 다크 그레이, 블루, 그린, 시안, 레드, 마젠타, 옐로우, 화이트.

static void WriteColor(string str) 
{ 
    var fgStack = new Stack<ConsoleColor>(); 
    var bgStack = new Stack<ConsoleColor>(); 
    var parts = str.Split(new[] { "<*" }, StringSplitOptions.None); 
    foreach (var part in parts) 
    { 
     var tokens = part.Split(new[] { "*>" }, StringSplitOptions.None); 
     if (tokens.Length == 1) 
     { 
      Console.Write(tokens[0]); 
     } 
     else 
     { 
      if (!String.IsNullOrEmpty(tokens[0])) 
      { 
       ConsoleColor color; 
       if (tokens[0][0] == '!') 
       { 
        if (Enum.TryParse(tokens[0].Substring(1), true, out color)) 
        { 
         bgStack.Push(Console.BackgroundColor); 
         Console.BackgroundColor = color; 
        } 
       } 
       else if (tokens[0][0] == '/') 
       { 
        if (tokens[0].Length > 1 && tokens[0][1] == '!') 
        { 
         if (bgStack.Count > 0) 
          Console.BackgroundColor = bgStack.Pop(); 
        } 
        else 
        { 
         if (fgStack.Count > 0) 
          Console.ForegroundColor = fgStack.Pop(); 
        } 
       } 
       else 
       { 
        if (Enum.TryParse(tokens[0], true, out color)) 
        { 
         fgStack.Push(Console.ForegroundColor); 
         Console.ForegroundColor = color; 
        } 
       } 
      } 
      for (int j = 1; j < tokens.Length; j++) 
       Console.Write(tokens[j]); 
     } 
    } 
} 

static void WriteLineColor(string str) 
{ 
    WriteColor(str); 
    Console.WriteLine(); 
} 

static void WriteColor(string str, params object[] arg) 
{ 
    WriteColor(String.Format(str, arg)); 
} 

static void WriteLineColor(string str, params object[] arg) 
{ 
    WriteColor(String.Format(str, arg)); 
    Console.WriteLine(); 
} 
1

CsConsoleFormat † 라이브러리를 사용하여 콘솔 출력을 색상으로 포맷 할 수 있습니다.

using static System.ConsoleColor; 

ConsoleRenderer.RenderDocument(new Document().AddChildren(
    new Span(">>> Order: ") { Color = Cyan }, 
    new Span("Data") { Color = Gray }, 
    new Span("Parity") { Color = DarkGreen }, 
    new Span(" <<<") { Color = Cyan } 
)); 

또는 대안 :

여기 코드가 어떻게 보이는지의 도우미 코드,

ConsoleRenderer.RenderDocument(new Document().AddChildren(
    new Span { Color = Cyan }.AddChildren(
     ">>> Order: ", 
     new Span("Data") { Color = Gray }, 
     new Span("Parity") { Color = DarkGreen }, 
     " <<<" 
    ) 
)); 

또는 (아래 참조) :

ColoredSpans.Render(">>> Order: ".Cyan(), "Data".Gray(), "Parity".DarkGreen(), " <<<".Cyan()); 

상위 두 방법은 매우 conscise되지 않지만 많은 이점을 가지고 있습니다 :

  • intetion을 명확하게 만들고 계층 구조를 지원합니다. 예를 들어, 부모 범위에 추가 된 자식 범위는 부모 색상을 상속합니다.
  • 도우미 메서드와 달리 ColoredConsoleWrite 전체적으로 조정할 수있는 전체 문서를 생성합니다 (예 : 단어 줄 바꿈, 배경).
  • Windows의 .NET 개발자가 백그라운드 색상을 설정하는 데 유용한 "역 콘솔 색상"개념에 의존하지 마십시오.

당신은, 당신이 좋아하는 코드를 작성, Edokan.KaiZen.Colors에서 영감을 도우미 메서드의 컬렉션을 사용할 수 있습니다 (예를 들어, 당신은 많은 단어를 강조하여 서식 단락을 많이 쓰기) 더 conscise 코드를 원하는 경우 위의 3 예에서 : CsConsoleFormat †

public static class Spans 
{ 
    public static Span Black(this string text) => new Span(text) { Color = ConsoleColor.Black }; 
    public static Span DarkBlue(this string text) => new Span(text) { Color = ConsoleColor.DarkBlue }; 
    public static Span DarkGreen(this string text) => new Span(text) { Color = ConsoleColor.DarkGreen }; 
    public static Span DarkCyan(this string text) => new Span(text) { Color = ConsoleColor.DarkCyan }; 
    public static Span DarkRed(this string text) => new Span(text) { Color = ConsoleColor.DarkRed }; 
    public static Span DarkMagenta(this string text) => new Span(text) { Color = ConsoleColor.DarkMagenta }; 
    public static Span DarkYellow(this string text) => new Span(text) { Color = ConsoleColor.DarkYellow }; 
    public static Span Gray(this string text) => new Span(text) { Color = ConsoleColor.Gray }; 
    public static Span DarkGray(this string text) => new Span(text) { Color = ConsoleColor.DarkGray }; 
    public static Span Blue(this string text) => new Span(text) { Color = ConsoleColor.Blue }; 
    public static Span Green(this string text) => new Span(text) { Color = ConsoleColor.Green }; 
    public static Span Cyan(this string text) => new Span(text) { Color = ConsoleColor.Cyan }; 
    public static Span Red(this string text) => new Span(text) { Color = ConsoleColor.Red }; 
    public static Span Magenta(this string text) => new Span(text) { Color = ConsoleColor.Magenta }; 
    public static Span Yellow(this string text) => new Span(text) { Color = ConsoleColor.Yellow }; 
    public static Span White(this string text) => new Span(text) { Color = ConsoleColor.White }; 
    public static void Render(object[] elements) => ConsoleRenderer.RenderDocument(new Document().AddChildren(elements)); 
} 

나에 의해 개발되었다.

관련 문제