2017-03-18 6 views
1

난 비주얼 스튜디오의 디자이너 속성 그리드의 비 굵게 그 값을 보여주기 위해 글꼴 유형에 대한 DefaultValueAtribute 클래스에 대한 값을 지정하는 데 사용해야하는 적절한 문자열 구문 인 알고 싶습니다 .Visual Studio의 Font 유형에 DefaultValueAtribute 클래스를 사용하는 방법은 무엇입니까?

C 번호를 :

내가 뭘하려

public class MyControl : UserControl { 

    [DefaultValue(typeof(Font), "Microsoft Sans Serif, 8.25pt")] 
    public override Font Font { 
     get { } 
     set { } 
    } 
} 

VB.NET :

Public Class MyControl : Inherits UserControl 

    <DefaultValue(GetType(Font), "Microsoft Sans Serif, 8.25pt")> 
    Public Overrides Property Font As Font 
     ... 
    End Property 

End Class 

... 그러나, 기본 글꼴 문자열에 표시됩니다 굵게 내 컨트롤의 Visual Studio 속성 표에.

정확하게 올바른 구문 분석 문자열을 찾고 있습니다. Reflection 또는 ShouldSerializeFOO 까다로운 방법이 아닙니다.

답변

1

그냥 기본값으로 Font 특성의 초기 값을 설정하는 것을 잊지 것, 그래서 컨트롤을 원하는 디폴트 값과 다른 및 표시됩니다 부모 글꼴을 사용합니다 굵게.

이 방법을 글꼴 기본값을 설정할 수 있습니다

using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
public partial class MyControl : UserControl 
{ 
    private const string MyDefaultFont = "Tahoma, 10pt"; 
    public MyControl() 
    { 
     InitializeComponent(); 
     this.Font = (Font)new FontConverter().ConvertFromString(MyDefaultFont); 
    } 
    [DefaultValue(typeof(Font), MyDefaultFont)] 
    public override Font Font 
    { 
     get { return base.Font; } 
     set { base.Font = value; } 
    } 
} 

참고 :Control.Fontambient property이며 Font 속성에 명시 적으로 값을 할당하지 않는 경우, 다음 직렬화하고하지 않습니다 컨트롤은 부모 Font 속성을 사용합니다. 일부 컨트롤에서 부모 글꼴 인 Font 이외의 다른 글꼴을 사용하려면 글꼴을 할당하는 것으로 충분합니다. 그래서 당신이 자식 컨트롤에 전혀 기본 글꼴을 할당 할 필요가없는 것 같습니다.

+0

답변 해 주셔서 감사합니다. 당신의 솔루션은 너무,하지만 내 경우에는 뒷받침 필드를 사용하지 않는 (@ LogGadget 대답 설명에서 내가 왜 설명) 작동합니다. 어쨌든 필자는 배킹 필드를 사용하도록 코드를 조정할 수 있지만 배킹 필드의 값은 다음과 같이 지정해야합니다 : ** Font MyDefaultFont = Control.DefaultFont ** 속성은 사용자 정의 기본 글꼴 이름을 하드 코딩하는 대신 ** DefaultValueAttribute ** 클래스는 "** Microsoft Sans Serif, 8.25 **"(** Control.DefaultFont ** 속성에서 얻은 것입니다.) 글꼴을 인식하지 못합니다. 나는 당신이 나를 이해했기를 바란다. (영어가 너무 좋지 않다) – ElektroStudios

+1

'Control.Font'는 [ambient property]이다. (https://msdn.microsoft.com/en-us/library/system.windows.forms.ambientproperties (v = vs.110).aspx) 'Font' 속성에 명시 적으로 값을 지정하지 않으면 직렬화되지 않고 컨트롤은 부모의 Font 속성을 사용합니다. 어떤 컨트롤이 부모 폰트 (font)와는 다른 폰트를 사용하게하고 싶다면 폰트를 폰트로 지정하는 것만으로 충분합니다. 그래서 당신이 자식 컨트롤에 전혀 기본 글꼴을 할당 할 필요가없는 것 같습니다. –

+1

나의 이전 코멘트를 기반으로, 당신은 콘트롤을위한 폰트를 전혀 설정할 필요가 없다. 그러나 어떠한 이유로 든 폰트 프로퍼티의 디폴트 값으로'Control.DefaultFont'와 같은 폰트를 지정하고자한다면, 해결책은 폰트 직렬화를 막기 위해'ShouldSerializeFont'를 사용하고 있습니다. –

1

PropertyGrid가있는 양식으로 테스트했습니다. 아마도 당신은 당신의 민간 백업 필드에 초기 값을 설정하지 않았을 것입니까?

Public Class MainWindow 
    Private Sub MainWindow_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
     Dim MC As New MyControl 
     Me.PropertyGrid1.SelectedObject = MC 
    End Sub 

    Public Class MyControl : Inherits UserControl 
     Private _Font As Font = New Font("Microsoft Sans Serif", 8.25) 

     <DefaultValue(GetType(Font), "Microsoft Sans Serif, 8.25")> 
     Public Overrides Property Font() As Font 
      Get 
       Return _Font 
      End Get 
      Set 
       _Font = Value 
      End Set 
     End Property 
    End Class 
End Class 

enter image description here

+0

답변 해 주셔서 감사합니다. 나는 뒷받침 필드를 사용하지 않고, ** font ** 속성을 오버라이드하여 setter 메서드를 사용하여 할당 된 글꼴을 자식 컨트롤의 Font 속성과 "동기화"합니다. 그것은 아주 짧은 코드입니다.) http://pastebin.com/PRWS9xG7 내 코드에서 DefaultValue 속성은 아무런 효과가 없습니다. 이유는 모르겠지만, 기본 글꼴은 UserControl. – ElektroStudios

+0

생성자에서 MyBase.Font = New Font ("Microsoft Sans Serif", 8.25)'를 추가 하시겠습니까? – MrGadget