2010-05-07 2 views
20

나는 내가 무엇을하고 있는지 설명하려고 노력할 것이다. 나는 그것에 대한 기술적 인 용어를 모른다. 그래서 여기에 간다.사용자 정의 컨트롤에서 디자인 지원을 활성화하는 방법은 무엇입니까?

예제 1 : Form에 ListView를 놓고 몇개의 열을 추가하면 디자인 타임에서 클릭 앤 끌기가 가능하다. 열의 크기를 조정합니다.

예제 2 : 이제 UserControl에 ListView를 배치하고 이름을 "MyCustomListView"로 지정합니다 (어쨌든 그것을 향상시키는 몇 가지 방법을 추가하십시오).

폼에 "MyCustomListView"를 배치했다면 디자인 타임에 열 머리글을 클릭하여 끌면 크기를 조정할 수 없습니다.

이렇게 쉽게 만들 수있는 방법이 있습니까? 의 일부 형식은 "기본 컨트롤에 클릭 앤 드래그 이벤트를 전달하고 해당 컨트롤이 마법을 수행하게합니다". 실제로 recode하려는 것은 아닙니다. mouseclick (또는 그게 무엇이든)을 전달하고, 위의 첫 번째 예제에서와 같이 ListView가 반응하도록합니다.

답변

47

Windows Forms 디자이너에는 대부분의 컨트롤 전용 디자이너 클래스가 있습니다. ListView 디자이너는 System.Design.dll 어셈블리의 내부 클래스 인 System.Windows.Forms.Design.ListViewDesigner입니다. 이 클래스는 열 머리글을 끌 수있는 기능을 제공합니다.

UserControl은 System.Windows.Forms.Design.ControlDesigner 디자이너 클래스를 사용합니다. 그것은 특별한 일을하지 않고 그냥 드래그 핸들을 사용하여 컨트롤 주위에 직사각형을 둡니다. 이것이 어디로 가고 있는지 알 수 있습니다. 폼에 사용자 정의 컨트롤을 배치 한 후에는 ListViewDesigner가 그림에없는 클래스를 디자인하는 데 사용되는 ControlDesigner입니다. 따라서 열 머리글을 끌 수있는 능력이 없어집니다. 또한 ControlDesigner는 UC 내부의 컨트롤에 대한 액세스 권한을 부여하지 않습니다.

그러나 독자적인 디자이너를 만들면 해결할 수 있습니다. 프로젝트 + 참조 추가 시작, System.Design을 선택하십시오. UC에 공용 속성을 추가하여 목록보기를 표시하고 [DesignerSerializationVisibility] 특성을 적용하여 변경된 속성을 저장할 수있게해야합니다. 그리고 [Designer] 특성을 UC 클래스에 적용하여 기본 디자이너를 바꿉니다. 그것은 모든 (기본 이름과 "직원"을 표시하는 ListView를 사용)과 유사합니다

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; // Note: add reference required: System.Design.dll 

namespace WindowsFormsApplication1 { 
    [Designer(typeof(MyDesigner))] // Note: custom designer 
    public partial class UserControl1 : UserControl { 
     public UserControl1() { 
      InitializeComponent(); 
     } 

     // Note: property added 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public ListView Employees { get { return listView1; } } 
    } 

    // Note: custom designer class added 
    class MyDesigner : ControlDesigner { 
     public override void Initialize(IComponent comp) { 
      base.Initialize(comp); 
      var uc = (UserControl1)comp; 
      EnableDesignMode(uc.Employees, "Employees"); 
     } 
    } 
} 

사용자 컨트롤의 목록보기 지금 클릭하고 정상으로 설계 할 수 있습니다.

+6

++ 친절하게 대해 주셔서 감사합니다. 당신이 나타나서 나에게 무언가를 가르쳐 주어서 기뻐. –

+4

그것은 완전한 해답의 완벽한 예일뿐입니다.) Thx! – Ted

관련 문제