我使用属性网格来显示一些属性。我希望用户能够选择字体但不能选择大小。我在我的类中添加了这样的字体属性,封装了属性网格的所有元数据:
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),然后是空白区域(字体的名称应该是),然后是椭圆按钮。有谁知道如何解决这两个问题?
谢谢
答案 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);
}
}
如果他试图输入另一个尺寸,这将是用途:
答案 1 :(得分:0)
您可以构建自定义属性网格。但是到目前为止我还没有使用过房产网格。你可以从下面的链接中获得参考资料可能对你有所帮助。
http://www.codeproject.com/Articles/22717/Using-PropertyGrid