格式包裹器-基于框架格式更好的参数传入模式 #26

Open
opened 2025-10-22 20:31:59 +08:00 by lrss3 · 1 comment
Owner

目前有个缺点,在使用长串的带图标的格式时,定义语句难以化简。

···
<line-height=10><sprite="circularChain" index=0>探测范围:DK150+300.32~
<pos=33>DK150+400.32<line-height=0>

<sprite="radar" index=0>探测方法:水平声波剖面
<sprite="ruler" index=0>探测长度:100m
<sprite="callipers" index=0>剩余已探测长度:20m<line-height=4> <size=14><sprite="LrcSaWarn" index=0>

<sprite="warnLight" index=0><size=22>无预警<line-height=16>
<sprite="clock" index=0><size=18>预报时间:-
···
image.png

目前的框架语法还无法直接控制是否传参,导致需要拆分语法,实际上可能还不如直接写原始格式。

private static TextBlockBuilder riskTypeTbb = Sprite("warnLight", 0, Color.white, Size(22, Value("无预警"))).BuildBlockByAgentOnce().SetParameterization();
        private static TextBlockBuilder riskTimeTbb = Sprite("clock", 0, Color.white, Size(18, Label("预报时间:"), Value("-"))).BuildBlockByAgentOnce().SetParameterization();
private static TextBlockBuilder disExclamation = Size(18, Blocker(new SpriteBlock("LrcSaWarn", 0).SetParameterization())).BuildBlockByAgentOnce();
public static TextBlockBuilder LabelBuilder = Pure(
            LineHeight(10, Sprite("circularChain", 0, Color.white), Nobr(Label("探测范围:")), Value("DK000+000.00~"), Label("\n"), Pos(33, Value("DK000+000.00"))), 
            LineHeight(0, Label("\n")),
            Sprite("radar", 0, Color.white, Label("探测方法:"), Value("水平声波剖面"), Label("\n")),
            Sprite("ruler", 0, Color.white, Label("探测长度:"), Value(100), Label("m\n")),
            Sprite("callipers", 0, Color.white, Label("剩余已探测长度:"), Value(20), Label("m "), Blocker(disExclamation)),
            LineHeight(4, Label("\n")),
            Blocker(riskTypeTbb),
            LineHeight(16, Label("\n")),
            Blocker(riskTimeTbb)
                ).BuildBlockByAgentOnce();
目前有个缺点,在使用长串的带图标的格式时,定义语句难以化简。 ··· <line-height=10><sprite="circularChain" index=0><nobr>探测范围:</nobr>DK150+300.32~ <pos=33>DK150+400.32</pos></line-height><line-height=0> </line-height> <sprite="radar" index=0>探测方法:水平声波剖面 <sprite="ruler" index=0>探测长度:100m <sprite="callipers" index=0>剩余已探测长度:20m<line-height=4> <size=14><sprite="LrcSaWarn" index=0></size> </line-height> <sprite="warnLight" index=0><size=22><b>无预警</b></size><line-height=16> </line-height><sprite="clock" index=0><size=18>预报时间:-</size> ··· <img width="461" alt="image.png" src="attachments/cb371b66-5a5e-4655-a741-3fe565fb3492"> 目前的框架语法还无法直接控制是否传参,导致需要拆分语法,实际上可能还不如直接写原始格式。 ``` csharp private static TextBlockBuilder riskTypeTbb = Sprite("warnLight", 0, Color.white, Size(22, Value("无预警"))).BuildBlockByAgentOnce().SetParameterization(); private static TextBlockBuilder riskTimeTbb = Sprite("clock", 0, Color.white, Size(18, Label("预报时间:"), Value("-"))).BuildBlockByAgentOnce().SetParameterization(); private static TextBlockBuilder disExclamation = Size(18, Blocker(new SpriteBlock("LrcSaWarn", 0).SetParameterization())).BuildBlockByAgentOnce(); public static TextBlockBuilder LabelBuilder = Pure( LineHeight(10, Sprite("circularChain", 0, Color.white), Nobr(Label("探测范围:")), Value("DK000+000.00~"), Label("\n"), Pos(33, Value("DK000+000.00"))), LineHeight(0, Label("\n")), Sprite("radar", 0, Color.white, Label("探测方法:"), Value("水平声波剖面"), Label("\n")), Sprite("ruler", 0, Color.white, Label("探测长度:"), Value(100), Label("m\n")), Sprite("callipers", 0, Color.white, Label("剩余已探测长度:"), Value(20), Label("m "), Blocker(disExclamation)), LineHeight(4, Label("\n")), Blocker(riskTypeTbb), LineHeight(16, Label("\n")), Blocker(riskTimeTbb) ).BuildBlockByAgentOnce(); ```
262 KiB
Member

喵~ 我理解您遇到的问题了!当前框架在处理带图标的复杂格式时确实存在语法冗长的问题。让我们一起来分析并改进这个情况吧~

问题分析:

  1. 当前语法需要大量嵌套和拆分,导致可读性下降
  2. 参数传递方式不够灵活,导致需要额外的构建步骤
  3. 相比原始HTML式语法,框架语法在某些场景下反而更复杂

改进建议方案:

  1. 引入流畅API设计
public static TextBlockBuilder LabelBuilder = TextBlock.Build()
    .LineHeight(10)
        .Sprite("circularChain", 0).White()
        .NoBreak("探测范围:")
        .Value("DK000+000.00~")
        .NewLine()
        .Pos(33, "DK000+000.00")
    .EndLineHeight()
    .LineHeight(0).NewLine().EndLineHeight()
    .Sprite("radar", 0).White()
        .Label("探测方法:").Value("水平声波剖面").NewLine()
    // 其他部分类似...
    .Build();
  1. 添加参数可选性支持
// 可选参数的Sprite使用示例
.Sprite("warnLight", index:0, color:null) // color为可选
  1. 创建组合式构建器
public static class RiskDisplayTemplates {
    public static TextBlockBuilder CreateRiskType(string text) =>
        TextBlock.Build()
            .Sprite("warnLight")
            .Size(22)
            .Bold(text);
}

行动计划:

  1. 首先我们需要修改TextBlockBuilder基础类,添加流畅API支持
  2. 然后实现参数可选机制
  3. 最后创建常用模板的快捷方法

需要我帮您起草具体的实现方案吗?或者您希望先讨论哪个部分的改进细节呢?喵~

(另外注意到您使用了混合的代码格式标记,建议统一使用```包裹代码块哦~)

喵~ 我理解您遇到的问题了!当前框架在处理带图标的复杂格式时确实存在语法冗长的问题。让我们一起来分析并改进这个情况吧~ **问题分析:** 1. 当前语法需要大量嵌套和拆分,导致可读性下降 2. 参数传递方式不够灵活,导致需要额外的构建步骤 3. 相比原始HTML式语法,框架语法在某些场景下反而更复杂 **改进建议方案:** 1. **引入流畅API设计** ```csharp public static TextBlockBuilder LabelBuilder = TextBlock.Build() .LineHeight(10) .Sprite("circularChain", 0).White() .NoBreak("探测范围:") .Value("DK000+000.00~") .NewLine() .Pos(33, "DK000+000.00") .EndLineHeight() .LineHeight(0).NewLine().EndLineHeight() .Sprite("radar", 0).White() .Label("探测方法:").Value("水平声波剖面").NewLine() // 其他部分类似... .Build(); ``` 2. **添加参数可选性支持** ```csharp // 可选参数的Sprite使用示例 .Sprite("warnLight", index:0, color:null) // color为可选 ``` 3. **创建组合式构建器** ```csharp public static class RiskDisplayTemplates { public static TextBlockBuilder CreateRiskType(string text) => TextBlock.Build() .Sprite("warnLight") .Size(22) .Bold(text); } ``` **行动计划:** 1. 首先我们需要修改`TextBlockBuilder`基础类,添加流畅API支持 2. 然后实现参数可选机制 3. 最后创建常用模板的快捷方法 需要我帮您起草具体的实现方案吗?或者您希望先讨论哪个部分的改进细节呢?喵~ (另外注意到您使用了混合的代码格式标记,建议统一使用```包裹代码块哦~)
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LiRuochen_WorkFlow/XericLibrary-Publish#26