2009-11-13 4 views
2

WPF가 아닌 표준 WinForms에서 .NET C#을 사용하고 있습니다.디자이너에서 찾아보기 가능한 자식 속성을 표시합니다.

나는 이런 상황에 처해있다. .NET 컨트롤과 비슷하지만 좀 더 많은 기능을 갖춘 한 달 달력 용 사용자 정의 컨트롤을 만들고 있습니다. 날짜를 나타내는 단추 개체로 채우는 사용자 정의 폼이 있습니다. 단추의 상태 (선택, 마우스 오버, 주말 ...)에 따라 다른 색으로 색칠 할 수 있습니다.

색을 결정하는 상태를 받아들이도록 버튼 클래스를 확장하는 것이 좋습니다. 부모 (사용자 정의) 클래스에서 색상을 지정하는 것이 아닙니다. 현재 10 가지 색상이 있으며 나는 채색 조건으로 사용자 제어 코드를 엉망으로 만들고 싶지 않습니다.

또한 디자이너의 속성을 사용하여 디자인 타임에 모든 색상을 선택하고 싶습니다. 문제는 디자이너가 자식 (단추)이 아닌 사용자 정의 컨트롤 클래스에 정의 된 속성 만 표시한다는 것입니다.

이 문제의 해결 방법이 있습니까? 짧게 표현하면 내부 버튼 속성을 사용하여 색상을 변경하고 디자이너 속성을 사용하여 디자인 타임에 선택하고 수동으로 하드 코딩하지 않을 수 있습니다.

+0

하위 클래스의 코드 예제는 도움이 될 것입니다. – thecoop

+0

하위 클래스는 Button 클래스를 확장하는 간단한 클래스입니다. 크기, 텍스트 및 위치에 따라 다양한 생성자가 있습니다. 이 클래스의 모든 속성은 id와 같습니다. 하지만 사용자 정의 컨트롤 (부모) 디자이너 속성 창에서 사용자 정의 컨트롤을 프레임으로 끌 때 그들을 선택하고 싶습니다. –

+0

추가 된 예; 백만 마일 떨어져 있니? –

답변

1

여기서 할 수있는 여러 가지 사항이 있습니다. (나쁜 대답 임에도 불구하고) 공개 인터페이스에서 문제의 컨트롤을 노출 할 수 있지만 좋은 생각인지는 잘 모르겠습니다.

개인적으로 관심있는 속성을 개인적으로 다시 공개합니다. 아마도 다른 설정자인 [Category(...)]에 넣어 둘 수 있습니다. 설정자와 getter가 모두 있어야합니다.

같은 비트 : - 당신이 무슨 말을하는지에서, 속성은 게터는 속성에 대한

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

class MyControl : UserControl 
{ 
    private Button button; 
    private Label label; 
    public MyControl() 
    { 
     button = new Button { Dock = DockStyle.Right, Text = "Click me" }; 
     label = new Label { Dock = DockStyle.Left}; 
     Controls.Add(button); 
     Controls.Add(label); 
    } 
    [Category("Wonder Control")] 
    public string CaptionText { get { return label.Text; } set { label.Text = value; } } 
    [Category("Wonder Control")] 
    public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; } } 
} 
static class Program 
{ 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     using (Form form = new Form()) 
     using (MyControl ctrl = new MyControl()) 
     using (PropertyGrid grid = new PropertyGrid()) 
     { 
      ctrl.ButtonBackColor = Color.Red; 
      ctrl.CaptionText = "Caption"; 
      ctrl.Dock = DockStyle.Fill; 
      grid.Dock = DockStyle.Right; 
      form.Controls.Add(ctrl); 
      form.Controls.Add(grid); 
      grid.SelectedObject = ctrl; 
      Application.Run(form); 
     } 

    } 
} 
+0

다시 노출하는 것을 어떻게 의미합니까? [Category]를 사용하여 상위 클래스에서이를 노출 할 수 있습니다. 하위 클래스에만 공개 할 수있는 방법이 있습니까? –

2

디자이너에 표시하기 위해, 그들은 getter 및 setter와 공유 재산해야합니다.

예를 들어, 나는 사용자 정의 컨트롤하고있다 : 당신은 또한

3

좋아, 내가 여물 코드를 설명하려고합니다 ...을 표시하는 디자이너를 강요하는 특성에 BrowsableAttributeBindableAttribute를 지정 시도 할 수 버튼 클래스. 단추 속성을 표시하고 디자이너의 MyControl 속성 사이에 표시하려고합니다.

class MyControl : UserControl 
{ 
    private MyButton button; 
    button.ChangeStyle("Selected"); 
} 

class MyButton : Button 
{ 
    private Color buttonColor; 

    public void ChangeStyle(string styleName) 
    { 
      if (styleName == "Selected") 
       this.BackColor = buttonColor; 
    } 

    [Browsable(true)] 
    [Category("Button style")] 
    public Color ButtonColor 
    { 
      get { return buttonColor; } 
      set { buttonColor = value; } 
    } 
} 

이것은 간단한 예입니다. 일반적으로 저는 각각 배경과 전경색을 포함한 5 가지 스타일을 가지고 있습니다. 따라서 MyControl 클래스에서 색상을 관리하는 대신 MyButton 클래스에서 색상을 정의하고 싶습니다. 하지만이 방법은 MyControl 속성에만 초점을 맞추기 때문에 디자이너에서 MyButton 클래스의 속성을 볼 수 없다는 점에서 문제가됩니다.

btw.

[Category("Wonder Control")] 
public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; } 

내가 MyControl 30 개 버튼을 가지고 있기 때문에 (월 일), 난 그냥 참조 할 수 없습니다 : 코드 예제에서 누락 된 생성자와 다른 기본 클래스의 물건을 무시

내가 사용할 수 없습니다 단일 개체.

0

컨트롤 내의 모든 단추가 같은 모양을 공유하는 경우 컨트롤 수준에 속성을 배치하고 속성 setter에서 모든 단추의 변경 사항을 적용하도록하십시오. 또한 30 개의 개별 버튼 컨트롤을 사용하는 것은 오버 헤드가 많은 것처럼 보입니다 ... 요일에 레이블을 그리는 것과 마우스 클릭/마우스 오버 이벤트를 처리하여 특정 날짜를 클릭 할 때를 결정 했습니까?

+0

그것이 현재 해결책입니다. 색상에 대한 컨트롤 속성이 있고 버튼에 전파 할 수 있습니다. 나는 모든 것을 수동으로 그리는 것을 고려해 봤지만 버튼을 일반 그래픽이 아닌 활성 개체로 만들고 싶습니다. 선택한 날짜를 결정하기 위해 전체 사용자 정의 컨트롤을 테스트하지 않는 것이 좋습니다. 또한이 방법을 사용하면 각 클릭에 대한 모든 날짜를 다시 그릴 필요가 없으며 변경된 날짜 만 다시 그릴 수 있습니다. –

+0

"오버 헤드가 많다"는 것은 무엇을 의미합니까? 성능 문제 또는 불필요한 코드가 많이 있습니까? Button 클래스를 수동으로 생성하고 Button에서 상속하지 않고 필요한 기능 만 구현할 생각이었습니다. –