2010-01-08 2 views
3

구성 요소 트레이에서 편집하는 동안 이름을 변경할 수있는 구성 요소를 만들었습니다. name 속성에 대한 Designer 액션을 추가했지만 이제 막혔습니다.WinForms .Net의 구성 요소 디자이너에서 구성 요소 이름을 변경할 수 있습니까

속성 표를 보면 이름 속성이 괄호로 묶여 일반 속성이 아니라는 것을 알 수 있습니다.

이것이 가능합니까?

+0

컨트롤의 이름을 변경 하시겠습니까? 왜 이렇게해야하는지에 대한 예가 있습니까? 이 선을 따라 생각하기보다 간단한 솔루션이있을 수 있습니다. – Codesleuth

+0

내 구성 요소는 향상된 메시지 상자 컨트롤의 스킨 \ 테마입니다. 용지함에서 새 스킨을 디자인하는 경우 속성 격자에 갈 필요없이 같은 위치에서 "Office Style"이라고 이름을 짓는 것이 좋습니다. – Jules

답변

1

일부 속성은 디자인 환경에서만 특수하며 유형 설명자를 통해 실제로 설정할 수 있습니다. 이것은 이름의 경우 일 수 있지만 Visible, Locked 및 Enabled와 같은 경우에 해당됩니다. 아마도 이것은 지금보아야 할 것을 당신에게 줄 것입니다.

SetHiddenValue(control, "Visible", false); 
SetHiddenValue(control, "Locked", true); 
SetHiddenValue(control, "Enabled", false); 

    /// <summary> 
    /// Sets the hidden value - these are held in the type descriptor properties. 
    /// </summary> 
    /// <param name="control">The control.</param> 
    /// <param name="name">The name.</param> 
    /// <param name="val">The val.</param> 
    private static void SetHiddenValue(Control control, string name, object val) 
    { 
     PropertyDescriptor descriptor = TypeDescriptor.GetProperties(control)[name]; 
     if (descriptor != null) 
     { 
      descriptor.SetValue(control, val); 
     } 
    } 
1

당신은 Component.Site.Name를 사용하여 디자인 타임에 Component의 이름을 변경할 수 있습니다. 이름이 중복되면 예외를 처리하기 위해 try/catch 블록에 코드를 넣어야합니다.

코드 : 당신이 당신의 구성 요소에 대한 디자이너를 구현

, 변화의 사람이 코드는 디자인 타임에 구성 요소의 이름은 다음과 같습니다

this.Component.Site.Name = "SomeName"; 

이 구성 요소의 전체 구현 및 구성 요소 디자이너. 구성 요소 디자이너에는 구성 요소를 마우스 오른쪽 단추로 클릭 할 때 액세스 할 수있는 동사가 있으며 명령 트레이의 속성 표에서 액세스 할 수도 있습니다. Rename 명령을 클릭하면 구성 요소 이름이 SomeName으로 설정됩니다. 또한 같은 이름의 구성 요소가있는 경우 오류 메시지를 표시합니다. 보다 현실적인 샘플에서는 ActionLists을 재정 의하여 사용자가 새 이름을 입력 할 수 있습니다.

using System; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Windows.Forms.Design; 

[Designer(typeof(MyComponentDesigner))] 
public class MyComponent : Component 
{ 
    public string SomeProperty { get; set; } 
} 

public class MyComponentDesigner : ComponentDesigner 
{ 
    DesignerVerbCollection verbs; 
    public MyComponentDesigner() : base() { } 
    public override DesignerVerbCollection Verbs 
    { 
     get 
     { 
      if (verbs == null) 
      { 
       verbs = new DesignerVerbCollection(); 
       verbs.Add(new DesignerVerb("Rename", (s, e) => 
       { 
        try 
        { 
         this.Component.Site.Name = "SomeName"; 
         this.RaiseComponentChanged(null, null, null); 
        } 
        catch (Exception ex) 
        { 
         var svc = ((IUIService)this.GetService(typeof(IUIService))); 
         svc.ShowError(ex); 
        } 
       })); 
      } 
      return verbs; 
     } 
    } 
}