C# PropertyGrid自定义字体属性
Im使用属性网格显示一些属性。我希望用户能够选择字体,但不能选择大小。我在类中添加了一个类似这样的字体属性,该属性封装了属性网格的所有元数据:C# PropertyGrid自定义字体属性,c#,propertygrid,C#,Propertygrid,Im使用属性网格显示一些属性。我希望用户能够选择字体,但不能选择大小。我在类中添加了一个类似这样的字体属性,该属性封装了属性网格的所有元数据: public class DetailFilterProperties : CollectionBase, ICustomTypeDescriptor { public DetailFilterProperties(TreeViewEventArgs e) {...} [CategoryAttribute("Base"), Descri
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);
}
}
然后我添加了一个新的转换器类:
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;
}
}
如果设置了字体属性,将返回一个新的字体转换器
问题是程序不会调用我的FontEditor的EditValue方法,因此当我单击椭圆按钮时,它总是显示字体对话框,其中包含更多选项,而不仅仅是8pt大小。属性网格也会显示属性的名称(字体),然后是一个空格(字体的名称应该在这里),然后是椭圆按钮。有人知道如何解决这两个问题吗
谢谢您可以构建自定义属性网格。然而,到目前为止,我还没有使用属性网格。您可以从下面的链接获得参考,该链接可能对您有所帮助 您可以定义一个自定义项,重新定义字体选择器对话框并设置最大和最小大小,如下所示:
[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);
}
}
如果用户尝试输入另一个尺寸,将看到以下内容:
我构建了一个自定义属性网格。我只想确保用户无法在我的属性网格中更改字体对话框中的大小属性。您可以将其标记为只读。[ReadOnly(true)]公共字符串ObjectAttribute1{get{return this.ObjectAttribute1;}set{this.ObjectAttribute1=value;}}但这样我就不再有字体对话框了,对吗?我的意思是属性网格将显示两行字符串值,其中一行为只读。我为字体编辑器添加了一个新类,并按照您的建议更改了属性的属性,但它仍然显示“旧(ms)字体”对话框。调试程序时,我注意到它没有跳入新字体编辑器的构造函数。有什么建议吗?什么是“旧ms字体对话框”?我应该可以很好地工作,或者发布一个复制代码。它会显示之前显示的字体对话框:用户可以选择字体大小>8pt的对话框。这可能是个问题,我正在使用属性描述符来显示数据。啊,好的,可能就是这样。尝试删除您的自定义类型描述器,您将看到它可以工作。您混淆了转换器和编辑器。如果你真的需要帮助,请发一份复印件