You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:23:29