2014-07-03 3 views
0

Im использует сетку свойств для отображения некоторых свойств. Я хочу, чтобы пользователь мог выбрать шрифт, но не выбирать размер. Я добавил свойство шрифта, как это мой класс обволакивающей все метаданные для свойства сетки:Свойство PropertyGrid для настройки свойства шрифта

public class DetailFilterProperties : CollectionBase, ICustomTypeDescriptor 
{ 
    public DetailFilterProperties(TreeViewEventArgs e) {...} 

    [CategoryAttribute("Base"), DescriptionAttribute("The font"), ReadOnly(true)] 
    public Font Font 
    { 
     get; 
     set; 
    } 
} 

Теперь может кто-нибудь пожалуйста, скажите мне, как включить только 8pt размер, чтобы убедиться, что пользователь не может изменить размер в шрифтах диалог?

благодарит за вашу помощь.

Edit:

Я изменил свою программу немного, и я думаю, что им почти нет. Пожалуйста, посмотрите ...

Я добавил класс для моего редактора шрифта:

public class ETFontEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     FontDialog dlg = new FontDialog(); 
     dlg = new FontDialog(); 
     dlg.MaxSize = 8; 
     dlg.MinSize = 8; 

     Font font = value as Font; 
     if (font != null) { 
      dlg.Font = font; 
     } 

     if (dlg.ShowDialog() == DialogResult.OK) 
      return dlg.Font; 

     return base.EditValue(context, provider, value); 
    } 
} 

Затем я добавил новый класс конвертер:

public class ETFontConverter : TypeConverter 
{  
    public ETFontConverter() 
    { 

    } 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     return new ETFontEditor(); 
    } 
} 

который будет возвращать экземпляр моего шрифта редактор. И последнее, я добавил метод моей собственности класса Descriptor:

public override TypeConverter Converter 
    { 
     get 
     { 
      var key = _key; 
      if (key.ToString() == "Font") { 
       return new ETFontConverter(this); 
      } 
      return base.Converter; 
     } 
    } 

который будет возвращать новый конвертер шрифта, если свойство шрифта устанавливается.

Проблема заключается в том, что программа не вызывает метод EditValue моего FontEditor, поэтому он всегда показывает диалог шрифта с большим количеством опций, чем просто 8pt для размера, доступного, когда я нажимаю кнопку эллипса. А также сетка свойств отображает имя свойства (Font), затем пробел (где должно быть имя шрифта), а затем кнопка эллипса. Кто-нибудь знает, как исправить эти две проблемы?

спасибо

+0

Вы путаете конвертер и редактор. Пожалуйста, разместите репродукцию, если вам действительно нужна помощь. –

ответ

0

вы можете создать настраиваемую сетку свойств. однако я до сих пор не использовал сетку свойств. вы можете иметь ссылку из ниже ссылки может быть вам полезна.

http://www.codeproject.com/Articles/22717/Using-PropertyGrid

http://www.youtube.com/watch?v=jO8Yfi_843I

http://msdn.microsoft.com/en-us/library/aa302326.aspx

+0

Я построил настраиваемую сетку свойств. Я просто хочу убедиться, что пользователь не может изменить свойство размера в диалоге шрифтов в моей сетке свойств. – user3596113

+0

Вы можете отметить это как readonly. [ReadOnly (true)] public string ObjectAttribute1 { get {return this.objectAttribute1; } комплект {этот.objectAttribute1 = значение; } } – Deeps

+0

, но тогда у меня больше не было бы диалога с шрифтами, верно? Я имею в виду, что в сетке свойств будут отображаться две строки со строковым значением, причем один из них будет только для чтения. – user3596113

1

Вы можете определить пользовательские UITypeEditor что переопределять диалог выбора шрифта и установить макс и мин размер, как это:

[CategoryAttribute("Base"), DescriptionAttribute("The font")] 
    [Editor(typeof(MyFontEditor), typeof(UITypeEditor))] 
    public Font Font 
    { 
     get; 
     set; 
    } 

    ... 

    public class MyFontEditor : UITypeEditor 
    { 
     public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
     { 
      return UITypeEditorEditStyle.Modal; 
     } 

     public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
     { 
      FontDialog dlg = new FontDialog(); 
      dlg = new FontDialog(); 
      dlg.MaxSize = 8; 
      dlg.MinSize = 8; 

      Font font = value as Font; 
      if (font != null) 
      { 
       dlg.Font = font; 
      } 

      if (dlg.ShowDialog() == DialogResult.OK) 
       return dlg.Font; 

      return base.EditValue(context, provider, value); 
     } 
    } 

Это это то, что будет видно, если он попытается ввести другой размер:

enter image description here

+0

Я добавил новый класс для своего редактора шрифтов, а также изменил атрибут для своего свойства, как вы предлагали, но его по-прежнему показывает старый (ms) шрифт. Отладка программы я замечаю, что она не перескакивает в конструктор моего нового редактора шрифтов. Какие-либо предложения? – user3596113

+0

Что такое диалог старых шрифтов ms? Я должен работать нормально или публиковать код. –

+0

Показывает диалог шрифтов, который он отображал раньше: тот, где пользователь может выбрать размер шрифта> 8pt. Возможно, проблема заключается в использовании дескриптора свойств для отображения данных. – user3596113

Смежные вопросы