>source

문제

레이블만 포함하는 사용자 지정 컨트롤을 만들려고 했습니다. 그러나 레이블의 텍스트가 디자인 타임에 사용자 지정 컨트롤의 name 속성이 받은 것으로 변경되기를 원했습니다.

내 사용자 정의 컨트롤의 클래스는 다음과 같습니다.

public partial class Tile : UserControl
{
     public Tile()
     {
         InitializeComponent();
     }
     [Browsable(true)]
     public override string Text { get=> label1.Text; set=> label1.Text= value; }
}

보시다시피, 저는 UserControl의텍스트레이블의 텍스트도 업데이트되는 방식으로 속성을이름결국 작동하지 않는 업데이트됩니다. 도구 상자에서 컨트롤을 드래그하여 레이블이 예상대로 업데이트되었지만 프로젝트를 빌드하는 순간 디자이너가 새로 고쳐지고 레이블의 텍스트가 손실된 경우가 발생했습니다.


내가 시도한 것

  • DesignerSerialization속성

    Google을 통해 StackOverflow에서 제공된 솔루션을 찾았습니다. Hans Passant에 의해 자체적으로DesignerSerializationAttribute(DesignerSerializationVisibility.Visible)값으로 문제를 해결할 수 있습니다텍스트재산에 의지가 주어진다 유효한 것으로 보이는 초기화 code에서 지속되어야 합니다. 처음에 길을 잃음(값이 지속되지 않고 디자이너에게 손실됨 다시 칠하기).

    그래서 다음과 같이 속성을 변경했습니다.

    [Browsable(true), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override string Text { get=> label1.Text; set=> label1.Text= value; }
    

이러한 변경을 하면 실제로 문제가 해결되었고 이제는 프로젝트를 빌드해도 작동했습니다.


내가 찾은 것

문제가 해결되었지만 다른 방법을 찾기 시작했습니다. 같은 결과에 접근합니다.

내 code로 더 많은 실험을 하는 동안 레이블을 노출하는 또 다른 속성텍스트속성 및 업데이트 재정의를 사용하여텍스트속성 그것은 정확히 작동합니다 를 사용하여 일하고 있었다DesignerSerialization속성.

새 code는 다음과 같습니다.

[Browsable(false)]
   public string LabelText { get=> label1.Text; set=> label1.Text= value; }
   [Browsable(true)]
   public override string Text { get=> LabelText; set=> LabelText= value; }


그것이 알고 싶었다

이것이 작동하는 이유는DesignerSerialization가시성):

텍스트----> 라벨텍스트---->레이블의텍스트

지금 당장은 아주 분명한 것을 묻고 있을지도 모르지만 몇 시간 전부터 그것에 대해 읽고 있어 약간 혼란스러웠습니다.

사용자 컨트롤의 Text 속성이 숨김(직렬화되지 않음)으로 표시되기 때문입니다. 두 번째 시나리오에서는 새 속성이 직렬화되고 나중에 사용할 수 있도록 텍스트를 유지합니다.

Reza Aghaei2022-01-26 06:00:13

속성의 기본 동작은 직렬화되지만 UserControl.Text 속성에 대해서는 명시적으로 해제됩니다. 따라서 LabelText는 직렬화되고 [Browsable(false)]은 이를 중지하지 않고 사실상 Text 속성을 유지합니다. 현명한 일은 이러한 속성과 Bindable 및 EditorBrowsable을 다시 켜는 것입니다.

Hans Passant2022-01-26 06:00:13

@HansPassant [Browsable(false)]을 사용하지 않으면 말이 안 되는 두 개의 속성(기본적으로 중복)이 표시됩니다.

Abhinav Pandey2022-01-26 06:00:13
  • 답변 # 1

    소스 code를 보면사용자 컨트롤, 당신은 볼 수 있습니다텍스트속성은 디자이너에 의해 직렬화할 수 없는 것으로 표시되므로 기본적으로 양식을 닫으면 속성 값이 손실됩니다.

    [Browsable(false),
    EditorBrowsable(EditorBrowsableState.Never),
    Bindable(false),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public override string Text {
        get {
            return base.Text;
        }
        set {
            base.Text= value;
        }
    }
    

    하지만 대체 솔루션에서 디자이너는라벨텍스트속성을 반환하고 나중에 해당 값을 사용하여 다음과 같이 반환합니다.텍스트. 그것이 작동하는 이유입니다.

    게시하기 전에 출처를 봤다면 스스로 답을 얻었을 것입니다. 지적해 주셔서 감사합니다.

    Abhinav Pandey2022-01-26 06:00:13
  • 이전 unity3d : 단일성. 버튼은 이미지 스프라이트의 색상을 어떻게 변경합니까?
  • 다음 reactjs : React 앱 오류: ENOSPC: 파일 감시자 수에 대한 시스템 제한에 도달했습니다.