// 滚动轴策略影响可滚动方向与内容测量约束:vertical 限宽并允许长高,horizontal 允许横向展开。 // 同一 paragraph 出现两次,文字内容共享,换行/偏移/范围在各 Mount 中独立。 // 通过具体出现位置的 Mount 操作偏移;ScrollBlock.axis 则是对象级策略,可影响其所有出现位置。 class Actions { // 两个不同 ScrollBlock 对象引用同一 paragraph;对象级 axis 策略各自保存,Mount 偏移也各自保存。 vertical: ScrollBlock horizontal: ScrollBlock // 只对 vertical 第一个 Mount 累加纵偏移,运行时按当前范围夹取。 // down.onClick 调用零参方法;点击发生在挂载之后,本例 vertical 仅有一个有效 Mount,故选择 at(0)。 function down(self: Actions): Unit { self.vertical.mounts().at(0).scrollBy(0, 60) } // 只对 horizontal 第一个 Mount 累加横偏移,禁止轴仍保持零。 // right.onClick 选择另一个滚动对象,60 是相对增量,不是强制把偏移设为 60。 function right(self: Actions): Unit { self.horizontal.mounts().at(0).scrollBy(60, 0) } // 分别把两个出现位置移回原点,不修改共享段落文字。 function reset(self: Actions): Unit { // reset.onClick 调用;这里用 scrollTo 指定绝对原点,保留容器尺寸和当前 axis 策略。 self.vertical.mounts().at(0).scrollTo(0, 0) self.horizontal.mounts().at(0).scrollTo(0, 0) } // 把左对象策略改为双轴,下一次求解重新计算约束和范围。 // both.onClick 改左侧对象策略而不是某次出现的偏移,也不把右侧 horizontal 改成双轴。 function both(self: Actions): Unit { self.vertical.axis = "both" } } paragraph = TextBlock("这里展示的是同一个 TextBlock。左侧只允许纵向滚动,文字会按照这个 Mount 的实际视口宽度换行;右侧只允许横向滚动,文字保留横向展开。对象的文字和业务状态只有一份,每次展示的约束、几何和滚动位置分别保存。修改滚动轴也会重新测量受影响内容,并将已经不再允许的偏移夹回零。布局传播持续到受影响部分稳定,不会按固定跳数丢弃后续更新。这里展示的是同一个 TextBlock,两个视图可以拥有不同的换行结果。") // 纵向区域padding后内容宽为244,长文字按此有限宽换行。 vertical = ScrollBlock(260, 140, paragraph) vertical.padding = 8 // 先给左对象设置 vertical,右对象随后独立设 horizontal;同一 paragraph 不保存任何一个父容器的轴策略。 vertical.axis = "vertical" // 横向区域沿滚动轴允许内容自然展开,所以同一文字可以比左侧更宽、更矮。 horizontal = ScrollBlock(260, 140, paragraph) horizontal.padding = 8 horizontal.axis = "horizontal" // 绑定四个零参数按钮回调;最终把两视图与控制区放在普通 Column/Row 中。 actions = Actions(vertical, horizontal) down = Button("向下滚动") down.onClick(actions.down) right = Button("向右滚动") right.onClick(actions.right) reset = Button("回到起点") reset.onClick(actions.reset) both = Button("左侧恢复双轴") both.onClick(actions.both) // 注册只保存函数,不提前查询 mounts;render 建立两个滚动区域的出现后,点击才会执行上述偏移操作。 page = Page() page.title = "滚动轴" page.render(Column(24, 16, TextBlock("同一个对象,不同的滚动轴", 2), Row(0, 24, Column(0, 8, TextBlock("vertical"), vertical), Column(0, 8, TextBlock("horizontal"), horizontal)), Row(0, 12, down, right, reset, both)))