사용자 지정 컨트롤을 만들고 리소스를 가리키는 새 속성을 추가했습니다.
사용자 지정 컨트롤의 다른 속성에서이 속성의 양식 디자이너에 설정된 값을 어떻게 가져올 수 있습니까? 읽으려고 할 때 반환되는 값은 null
입니다.
Custom Control 및 언급 된 속성과 관련된 내 코드 :
class ResourceLabel : Label
{
private string resourceKey;
[Category("Appearance")]
[Browsable(true)]
[Description("Sets the resource key for localization")]
public string ResourceKey
{
get { return resourceKey; }
set {
if (resourceKey != value) {
resourceKey = value;
Invalidate();
}
}
}
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Bindable(true)]
public override string Text
{
if (base.Text != value) {
Console.WriteLine($"Test: {ResourceKey}");
if (ResourceKey != null) {
var locale = CultureInfo.GetCultureInfo(Properties.Settings.Default.Language);
var textFromResource = Resources.ResourceManager.GetString(ResourceKey, locale);
base.Text = textFromResource;
}
else {
base.Text = value;
}
}
}
}
이 문자열 Console.WriteLine($"Test: {ResourceKey}");
은 null
.
문제에 대한 설명과 사용자 지정 컨트롤 의 Description
속성에 적용된 특성을 감안할 때 ResourceKey
응용 프로그램을 지역화하여 결과적으로 Localizable
부모 Form 의 속성을 true
.
이로 인해 Form 초기화의 일부 세부 정보가 변경됩니다.
Form.Designer.cs 파일을 살펴보면 몇 가지 새로운 부분이 추가되었음을 알 수 있습니다
.
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(YourForm));
이제 새로운 동료가 있습니다. 각 컨트롤의 초기화 섹션에 resources.ApplyResources(this.controlName, "controlName");
추가되었습니다.
맞춤 라벨은 다음과 같이 표시되어야합니다.
resources.ApplyResources(this.resourceLabel1, "resourceLabel1");
에서 파생 된 많은 표준 속성 Control
은 지역화 할 수 있습니다 ( [Localizable(true)]
속성 으로 장식 됨 ). 텍스트 속성은이 중 물론이다 . 이러한 등록 정보의 값은 이제 다른 지역화에 사용되는 리소스 파일에 저장됩니다. 따라서 이러한 속성은 더 이상 Designer.cs 파일에 설정되지 않으며 다른 속성보다 먼저 초기화됩니다.
귀하의 ResourceKey
특성은 다음과 같이 정의되어 있지 Localizable
그것이 Designer.cs 파일에 추가하고 지역화 특성 후 초기화, 그래서.
► 간단한 수정은 ResourceKey
속성을로 정의하는 Localizable
것입니다 Text
. 따라서 속성과 함께 지역화되지 않은 속성보다 먼저 초기화 됩니다.
[Localizable(true), Browsable(true)]
[Category("Appearance"), Description("Sets the resource key for localization")]
public string ResourceKey {
get { return resourceKey; }
set {
if (resourceKey != value) {
resourceKey = value;
Invalidate();
}
}
}
이는 약간의 주요 변경 사항 이므로 다음을 수행해야합니다.
1 - 추가 Localizable
받는 사람 속성을 ResourceKey
속성
2 - 제거 된 ResourceLabel
폼 디자이너에서 컨트롤을
3 - 컴파일 솔루션
4 - 사용자 정의 추가 ResourceLabel
그것이 다시
설정 속성 패널에서 필요한 컨트롤의 속성 - 5
6 - 응용 프로그램을 실행 또는 컴파일 프로젝트
Form의 Designer.cs 파일을 확인하고 ResourceKey
속성이 사라 졌는지 확인합니다 resources.ApplyResource()
. 이제 해당 값이 .
► 해당 속성을 지역화 가능하게 만들고 싶지 않으면 나중에 Control의 초기화가 완료 될 때 해당 값을 읽어야합니다 . OnHandleCreated
예를 들어 메서드를 재정의합니다 . 컨트롤의 핸들은 런타임에 몇 가지 경우에 다시 만들 수 있습니다 (컨트롤이 핸들을 다시 만드는 데 필요한 주요 속성 설정).
참고 :
속성의 초기화 시퀀스에 의존해서는 안됩니다. 속성이 다른 속성보다 먼저 초기화된다는 보장은 없습니다. 컨트롤의 동작을 디자인 할 때 이것을 고려하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다