2009-10-01 3 views
5

저는 WinForms 응용 프로그램을 만들고 있는데 대부분의 컨트롤에서 특정 색상을 사용하고 있습니다. WinForms 디자이너에서 때로는, 그리고 때로는 직접 내 코드에 직접 사용합니다. WinForm 응용 프로그램에서 응용 프로그램 전체의 색상 코드를 구현하는 방법은 무엇입니까?

나는 정적 클래스 어딘가에 그렇게 찾고 있어요 :

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

    } 

내가 아주 쉽게 내 코드에서 색상을 사용할 수 있지만이 오류가 발생합니다 디자이너에서 할 불가능 :

MyColors.DarkGreen은 Int32에 대한 유효한 값이 아닙니다.

(I 그 색의 INT32 표현을 저장하기 위해 노력했지만,이 같은 오류와 함께 실패) 내가 지금 사용하고이 솔루션은 디자이너에서 RGB 색상 코드를 사용하는 것입니다

, MyColors 클래스 값을 내 코드에 넣고 Visual Studio의 모든 기능을 바꾸어 변경합니다. 이것은 좋은 해결책은 아니지만 지금까지 더 좋은 아이디어를 찾을 수 없었습니다.

아이디어가 있으십니까?


참고 : 나는 내가 "KnownColors을"변화에서 찾는 게 아니에요으로, 광산에서 약간의 차이 인 약 this question을 알고있다.

답변

2

추가 색상 정의에 대한 디자이너 지원을 받으려면 Color 편집기를 확장하거나 대체하는 자체 편집기를 만들어야 할 수도 있습니다. 이들을 정의한 후에 영향을받는 속성에 Editor 속성을 적용하여 편집기에서 사용할 속성을 디자이너에게 알려줘야합니다.

TypeConverterTypeConverterAttribute과 유사한 작업을 수행하여 어느 정도 성공할 수도 있습니다.

+0

@Jeff : 기본 winforms 컨트롤 (단추, 레이블 등)의 색을 업데이트하려고하므로 모든 컨트롤에서 상속하지 않으면 Editor 속성을 해당 ForeColor/BackColor 속성에 실제로 적용 할 수 없습니다. 과도한 소리가 들려요 ... 아니면 뭔가를 놓쳤습니까? – Brann

+0

@Brann : 이미 양식을 구현하여 상속합니다. 자신의 형식으로 재정의를 적용해야합니다. –

+0

물론, 폼 내의 컨트롤은 부모 컨트롤에서 상속 받기 위해 Color.Empty로 설정되어야합니다. 그렇지 않으면이 컨트롤도 재정의해야합니다. 디자이너 지원을받을 수있는 대안이 없다고 생각합니다. 걱정됩니다. –

2

속성 창 자체의 동작을 변경해야하기 때문에 가능하지 않다고 생각합니다. 속성 창에 시스템 색상, 이름이 지정된 "웹"색상 또는 RGB 지정 색상으로 입력 된 것을 전환하려고하는 코드가 포함되어 있기 때문에 "255, 128, 64"로 입력하면 "blah blah blah Int32에 유효한 값이 아닙니다. " "MyColors.DarkGreen"과 같이 변환 할 수없는 모든 텍스트에 대한 메시지입니다.

+1

자신의 TypeConverter를 제공하여이 동작을 무시할 수 있지만 컨트롤을 재정의하여 해당 컨트롤이 작동하도록 속성에 추가해야합니다. –

+0

@Jeff : 당신을 믿습니다. 그리고 StackOverflow의 전형적인 것으로서, 당신이 이것을 할 수있는 방법을 제안하기 위해 당신이 투표를하지 않을 때 (당신이 이것을 할 수는 없다) 투표를 얻습니다. :) – MusiGenesis

1

아마도 가장 좋은 방법은 디자이너에서 아무 것도 시도하지 않는 것입니다. 디자인 타임에 기본 색상으로 모든 양식을 그대로 두십시오.

나는 당신과 비슷한 계획을 갖고 있으며 모든 종류의 문제가 닥쳤다. 버튼이 디자이너에서 RGB 값으로 설정되었습니다. 동일한 폼의 다른 버튼은 정적 클래스의 코드에 설정된 색상을 가지며 두 색상이 약간 다릅니다. 시간이 지남에 따라 이러한 문제가 발생합니다.

색상을 변경하려면 정적 클래스를 변경하고 양식의을 확인해야합니다. 미묘한 차이점은 분명하지 않습니다.

코드에서 모든 색상을 설정하면 컨트롤을 놓친 경우 즉시 확인됩니다. 색상을 변경하려면 한 곳에서 변경해야합니다.

우리가 한 또 다른 조작은 이름에 언급 된 사용법이있는 정적 클래스에 멤버를 추가하는 것이 었습니다. 예를 들어

: 당신이 오렌지 DarkGreen에서 모든 버튼을 변경하려는 경우

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

     public static Color ButtonBackColor = DarkGreen; 
    } 

이 방법은, 그것은 단지 하나 개의 라인 변화입니다.

0

이렇게하면 원하는 결과를 얻을 수 있습니다. 제거 할 수있는 괄호 수가 너무 많습니다.

public static Color DarkGreen = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(70)))), ((int)(((byte)(62))))); 
1

당신이 테마 접근 방식을하려는 경우, 고정 배경색 및 데 ForeColor 속성, 즉 레이블 구성 요소를 생성하고 아래와 같이 뒤의 코드를 변경 :

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace YourNameSpace 
{ 
    public partial class NameOfStaticColoredLabel : Label 
    { 
     public NameOfStaticColoredLabel() 
     { 
      InitializeComponent(); 
     } 

     public NameOfStaticColoredLabel(IContainer container) 
     { 
      container.Add(this); 

      InitializeComponent(); 
     } 

     public override Color ForeColor 
     { 
      get 
      { 
       return Color.Black; 
      } 
      set 
      { 
       base.ForeColor = Color.Black; 
      } 
     } 

     public override Color BackColor 
     { 
      get 
      { 
       return Color.Aquamarine; 
      } 
      set 
      { 
       base.BackColor = Color.Aquamarine; 
      } 
     } 
    } 
} 

을 당신이해야 모두 볼 수 있듯이 do는 라벨 컨트롤의 관련 속성을 오버라이드합니다. 그런 다음이 라벨을 응용 프로그램 양식에 끌어 놓습니다. 색상을 변경해야하는 경우 위 클래스에서 수행하고 앱을 다시 작성하십시오. 이 방법을 사용하면 고정 색상의 레이블이 만들어지며 디자이너 나 코드에서 색상을 변경할 수 없습니다.

관련 문제