c# - 如何在 PropertyGrid 中自定义绘制 GridItem?
问题描述
我想以与 ListView(详细信息)和其他控件中的所有者绘图项类似的方式在我的 PropertyGrid 中绘制属性值。
如果一个属性被声明为颜色类型,它的值是在字符串描述旁边用颜色样本绘制的。如果属性是一种图像,则在字符串描述旁边绘制图像的缩略图。
我有一个属性,它是一个包含三个颜色类型属性的类。我想在属性名称旁边的 PropertyGrid 中绘制所有三种颜色。该类有一个 ExpandableObjectConverter 作为 TypeConverter,其中颜色被编辑,但我所知道的更改属性值显示方式的唯一选项是使用 TypeConverter 返回一个字符串。
解决方案
您需要通过从UITypeEditor派生并覆盖其GetPaintValueSupported和PaintValue来为您的类型(具有 3 个颜色属性)创建一个编辑器 。然后使用Editor属性为您的类注册编辑器:
示例
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
public class MyComponent : Component
{
public SampleClass SampleProperty { get; set; } = new SampleClass();
}
[TypeConverter(typeof(ExpandableObjectConverter))]
[Editor(typeof(SampleClassEditor), typeof(UITypeEditor))]
public class SampleClass
{
public Color Color1 { get; set; } = Color.Red;
public Color Color2 { get; set; } = Color.Green;
public Color Color3 { get; set; } = Color.Blue;
}
public class SampleClassEditor : UITypeEditor
{
public override bool GetPaintValueSupported(ITypeDescriptorContext context)
{
return true;
}
public override void PaintValue(PaintValueEventArgs e)
{
var sample = e.Value as SampleClass;
if (sample != null)
{
int x = e.Bounds.X, y = e.Bounds.Y;
int w = e.Bounds.Width, h = e.Bounds.Height;
using (var b = new SolidBrush(sample.Color1))
e.Graphics.FillRectangle(b, x, y, w / 3, h);
using (var b = new SolidBrush(sample.Color2))
e.Graphics.FillRectangle(b, x += w / 3, y, w / 3, h);
using (var b = new SolidBrush(sample.Color3))
e.Graphics.FillRectangle(b, x += w / 3, y, w / 3 + 1, h);
}
base.PaintValue(e);
}
}
推荐阅读
- algorithm - 为什么假设乘以 n 的时间复杂度是常数?
- javascript - 突出显示/错误不适用于“远程”验证
- node.js - 无法读取未定义的属性“连接”。已安装依赖项
- python-3.x - 求解具有一些边界条件的矩阵方程
- ios - iOS以编程方式更改设置字体
- react-native - 带有 TabNavigation 的标题反应导航
- javascript - JavaScript 算法脚本
- angular - 错误类型错误:无法读取 Angular 7 拖放中未定义的属性“长度”
- android - 如何在android应用程序中放入大量数据?
- css - 如何限制列 flexbox 布局中水平滚动部分的大小?