2014-10-08 3 views
1
나는 다음과 같은 속성이 기본 사용자 지정 컨트롤에서 상속 일부 사용자 지정 컨트롤을 만드는거야

:사용자 정의 속성

public Color BorderColor 
    { 
     get { return BorderColor; } 
     set 
     { 
      if (!FollowsScheme) 
       BorderColor = value; 
     } 
    } 

    public Color[] FillColors 
    { 
     get { return FillColors; } 
     set 
     { 
      if (!FollowsScheme) 
       FillColors = value; 
     } 
    } 

    public bool FollowsScheme { get; set; } 

내가 그렇게 사용자가 false로 FollowsScheme를 만 다음 설정하면 만들려고을 BorderColor 및 FillColors 속성을 편집 할 수 있습니까? FollowsScheme이 true이면 두 속성을 편집 할 수 없습니다. 이 코드에서는 내가 뭘 하려는지 생각해 볼 수 있지만, 솔루션을 빌드하고 컨트롤을 폼에 추가하면 Visual Studio에서 충돌이 발생합니다. 어떻게해야합니까?

FollowsScheme을 true로 설정하면 OnPaint 메서드에서 코드는 내가 디자인 한 테마의 색으로 채워진 정적 클래스를 기반으로하는 BorderColor 및 FillColors 속성을 기반으로 컨트롤을 그립니다. FollowsScheme이 false로 설정된 경우 OnPaint 메서드는 BorderColor 및 FillColors 속성을 가져 와서 새 구성표를 계산하고 나열된 전용 속성으로 이러한 색을 설정 한 다음 컨트롤을 그리는 데 사용됩니다.

답변

3

당신이 컨트롤을 추가 할 때 이해 양식에 Visual Studio는 해당 컨트롤을 렌더링하는 데 필요한 코드를 실행하여 디자이너에 표시 할 수 있도록합니다.

코드가 StackOverflowException이면 Visual Studio가 충돌합니다.

이 예외는 속성 설정자가 무한 재귀 적이기 때문에 발생합니다. 해결책은 다음과 같이 값을 보유 할 배경 필드를 도입하는 것입니다.

private Color borderColor; 
public Color BorderColor 
{ 
    get { return this.borderColor; } 
    set 
    { 
     if (!FollowsScheme) 
      this.borderColor = value; 
    } 
} 
+0

나는 항상 소스 코드의 속성에 대한 필드를 보았으며 그게 무엇인지 깨닫지 못했습니다! 고맙습니다! – Minato

+0

@ 미나토 모든 좋은 사람. * 두 속성에 대한 배경 필드를 도입해야합니다. 귀하의 질문에 적절하게 대답한다면이 대답을 받아 들인 것으로 간주하십시오. –

+0

예, 저는 실제로 답변을 받아 들일 때까지 기다리고 있었고 트랙을 잃었습니다. 다시 한번 감사드립니다. – Minato

0

당신은 일반적으로 다음과 같이

public Color BorderColor 
{ 
    get { return BorderColor; } 
    set 
    { 
     if (!FollowsScheme) 
      BorderColor = value; // BOOM! 
    } 
} 

당신이 당신의 재산에 대한 백업 멤버 변수를 사용하는 데 필요한 속성 setter 내부의 속성을 설정됩니다

private Color borderColor; 
public Color BorderColor 
{ 
    get { return borderColor; } 
    set 
    { 
     if (!FollowsScheme) 
      borderColor = value; 
    } 
}