我不太想回答你的“Viewbox中的RichTextBox输入光标消失”的问题,在我过去的项目中遇到过2k、4k甚至更大分辨率的屏幕,如集群渲染机在一块超大分辨率屏幕下分割显示等情景。我的结论是自适应各种分辨率靠的不是简单缩放,而是布局自适应,就像鸿蒙多端自动适配的功能。但鸿蒙要做的是系统层面的自适应,现阶段很难很难。微软、苹果和谷歌在这边面已经做了很多努力,如微软的.NET Standard for UWP以及XAML,谷歌的Flutter,和苹果WWDC20提到的,SwiftUI几乎是下一代Apple全平台融合的首选框架。很长一段时间的自适应还是需要我们程序员来实现的,并且也没有完美方案。
自适应这块Web相较于PC远远走在前列。Bootstrap 很早就支持响应式设计了。
超小屏幕 | 小屏幕 | 中等屏幕 | 大屏幕 |
---|---|---|---|
手机 (<768px) | 平板 (≥768px) | 桌面 (≥992px) | 桌面 (≥1200px) |
WPF仅用于桌面端,屏幕没那么复杂。虽然现在分辨率各种各样,如1366 x 768、1920 x 1080、3000 x 2000(MateBook、Surface Book)、2736 x 1824(Surface Pro)、3240 x 2160(Surface Book)、3840x2160(Lenovo),但屏幕比例相差不大。
利用WPF的容器控件,尽可能设置控件的HorizontalAlignment、VerticalAlignment和Grid的按比例布局,而不是Width、Height、Margin、Padding,即所有属性一旦设置了像素数值就很难做到适应。那用Viewbox不是能很好的缩放么,在一定的范围内还行,缩放稍微过大就会有问题,不管设为Fill、Uniform,还是UniformToFill,要么变形失真,要么缩小到看不见,这种自适应用户是很难受的。
赘述这么多,到底该怎样做呢。举个栗子,Win10开始菜单的磁贴布局摆放,是可以根据开始菜单的大小进行自适应的,如果菜单比较宽,横向可以显示更多的磁贴,如果宽度变窄则竖向显示更多磁贴,再通过滚动滚动条查看更多内容。再举个栗子,一个软件配置窗口,正常1920 x 1080分辨率下是可以完全一屏显示下所有配置项的,但如果软件使用win10的左右二分屏,那软件横向区域会减少一半,通过将更多的内容纵向排列以及显示滚动条照样可以很好的显示。这种方式才是响应式布局,不会出现上面缩放提到的变形失真和字体模糊。再加上win10的系统级缩放,超分辨率下显示效果也会很好。所以我们应该避免使用放大镜式的缩放,辛苦点,做一些响应式布局的工作,对于wpf来说,这不难。
抱歉 才看到。我可以按照百分比布局,之前也是这样做的。但是产品那边非要自适应所有屏幕,要按1920*1080的设计图来,所有控件尺寸都是固定的。刚开始这样做也没什么问题。所有内容都按预期的样子展示了。只有 文本框和 富文本框的 输入光标 会偶尔消失。我查了下是因为viewbox内部的缩放规则导致的。 文本框我自己处理了。画了个输入光标 通过定位也可以定位到正确的地方。但是richtextbox 这个不好处理,虽然也可以自己画一个光标,但是定位不太好定位。所以才来问一下有没有什么好的方法
@阿里啪啪☺:
ViewBox实现中使用了ScaleTransform,ScaleTransform算法速度优先,当内容缩放非常小时可能会丢失像素,ScaleTransform对RichTextBox具体缩放机制不清楚,确实很难办,你可以去啃源代码。
你可以尝试将RichTextBox的内容缩放,而不是将RichTextBox放在ViewBox中进行整体缩放,看能否避免这种情况。FlowDocument的顶级子元素包括:BlockUIContainer、List、Paragraph、Section和Table,你们对RichTextBox的需求只是文本内容的话,可以在后置代码中手动控制Paragraph的缩放,所有继承自 Inline 的元素都能得到有效缩放。所以你可以试试基于RichTextBox自定义这么一个类。
<Viewbox Stretch="Uniform">
<RichTextBox Name="rtb" Width="70">
<FlowDocument>
<Paragraph>
<Run>格式化文本内容</Run>
</Paragraph>
<BlockUIContainer>
<Button>点击我!</Button>
</BlockUIContainer>
</FlowDocument>
</RichTextBox>
</Viewbox>
题外话:如果你们软件的目标系统是win10,用系统的缩放就可以替代ViewBox的缩放了。你们产品部的本意是好的,只是分辨率比例和1920*1080不一致,最终显示效果会比较感人。
@楚人Leo: 好吧。我再研究一下。现在已经是在 整个窗体最外层 放了一个viewbox。重改的话 改动还是挺大的。。为了一个文本框 不值得~~。太难了 看来viewbox 只能缩放 除了用户输入 之外的东西。。
@阿里啪啪☺: 我们一般自定义Chart、仪表控件时Viewbox用得多点,这些控件在显示空间不足时进行一定层度保留横纵比的缩放,超过缩放阈值也会裁剪内容,不会无限缩放下去。
@楚人Leo: 好的大佬,明天研究研究😁 😁 😁
.....TextBox 的高度设高一点,有时候设计图和实际是不一样的...
既如此你搞一个粗大的光标试试不就行了。