如何在SQL表中存储日程控件预约状态对应的Brush?
为DevExpress Scheduler预约状态映射自定义Brush的实现方案
核心思路
默认状态颜色映射仅支持纯色,要实现自定义Brush(如渐变、纹理),需通过自定义状态存储+Scheduler事件拦截完成,具体步骤如下:
1. 扩展数据库状态表
在你的状态数据表中新增字段,用于存储Brush的序列化信息:
- 推荐使用
nvarchar(max)类型保存Brush的Base64序列化字符串,也可选用二进制字段存储序列化字节流
2. 实现Brush的序列化与反序列化
在数据访问层编写转换逻辑,实现Brush与存储字符串的互转:
// 将Brush序列化为Base64字符串 public string SerializeBrush(Brush brush) { using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, brush); return Convert.ToBase64String(ms.ToArray()); } } // 从Base64字符串反序列化为Brush public Brush DeserializeBrush(string serializedString) { if (string.IsNullOrEmpty(serializedString)) return Brushes.Transparent; using (var ms = new MemoryStream(Convert.FromBase64String(serializedString))) { var formatter = new BinaryFormatter(); return (Brush)formatter.Deserialize(ms); } }
若为WPF场景,也可使用
XamlReader/XamlWriter实现Brush的XAML序列化,更贴合WPF技术栈
3. 拦截Scheduler的状态绘制事件
绑定Scheduler控件的AppointmentViewInfoCustomizing事件,为每个预约替换自定义状态Brush:
private void SchedulerControl_AppointmentViewInfoCustomizing(object sender, AppointmentViewInfoCustomizingEventArgs e) { // 获取当前预约关联的状态ID var statusId = e.ViewInfo.Appointment.StatusId; // 从数据库/状态缓存中读取该状态对应的序列化Brush字符串 var serializedBrush = GetSerializedBrushByStatusId(statusId); // 反序列化为Brush并替换默认绘制Brush e.ViewInfo.StatusBrush = DeserializeBrush(serializedBrush); }
4. 状态Brush编辑扩展(可选)
若需在UI中编辑状态Brush,可集成WPF原生BrushEditor或DevExpress的ColorPickEdit(支持Brush类型),将选择的Brush序列化后写入数据库即可。
关键注意事项
- 注意区分WinForms与WPF的Brush类型,序列化/反序列化逻辑需与平台匹配
- 对高频访问的状态,建议将Brush缓存至内存,避免重复反序列化损耗性能
- 若使用EF等ORM框架,可为状态实体添加计算属性,自动处理Brush的序列化与反序列化
内容的提问来源于stack exchange,提问作者Bjorn Meijer
相关产品推荐
相关产品推荐

