PropertyGrid自定义字体属性

时间:2014-07-03 05:53:12

标签: c# propertygrid

我使用属性网格来显示一些属性。我希望用户能够选择字体但不能选择大小。我在我的类中添加了这样的字体属性,封装了属性网格的所有元数据:

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

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

现在任何人都可以告诉我如何只启用8pt大小以确保用户无法在字体对话框中更改大小?

感谢您的帮助。

编辑:

我改变了我的程序,我想我差不多了。请看看......

我为我的字体编辑器添加了一个类:

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);
    }
}

然后我添加了一个新的Converter类:

public class ETFontConverter : TypeConverter
{       
    public ETFontConverter()
    {

    }

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

将返回我的字体编辑器的实例。最后我在我的属性描述符类中添加了一个方法:

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

如果设置了font属性,将返回一个新的字体转换器。

问题是程序不会调用我的FontEditor的EditValue方法,因此当我单击椭圆按钮时,它总是显示字体对话框,而不仅仅是8pt的字体对话框。并且属性网格显示属性的名称(Font),然后是空白区域(字体的名称应该是),然后是椭圆按钮。有谁知道如何解决这两个问题?

谢谢

2 个答案:

答案 0 :(得分:2)

您可以定义一个自定义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

答案 1 :(得分: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