首页 新闻 会员 周边

WPF viewbox中的RichTextBox输入光标消失

0
悬赏园豆:200 [已解决问题] 解决于 2020-08-07 15:12

WPF开发 想自适应各种分辨率。设计图是19201080 的。
<viewbox>
<Grid Width="1920" Height="1080">
<RichTextBox/>
</Grid>
</viewbox>
这样的话。界面上所有布局都是按照1920
1080下的设计宽度来的。所有控件都没有问题 只有TextBox 和 RichTextBox 会有光标消失的问题(感觉是线太细了显示不出来),请问一下有什么解决办法吗

飞翔的猪小猪的主页 飞翔的猪小猪 | 初学一级 | 园豆:3
提问于:2020-06-30 11:52
< >
分享
最佳答案
0

我不太想回答你的“Viewbox中的RichTextBox输入光标消失”的问题,在我过去的项目中遇到过2k、4k甚至更大分辨率的屏幕,如集群渲染机在一块超大分辨率屏幕下分割显示等情景。我的结论是自适应各种分辨率靠的不是简单缩放,而是布局自适应,就像鸿蒙多端自动适配的功能。但鸿蒙要做的是系统层面的自适应,现阶段很难很难。微软、苹果和谷歌在这边面已经做了很多努力,如微软的.NET Standard for UWP以及XAML,谷歌的Flutter,和苹果WWDC20提到的,SwiftUI几乎是下一代Apple全平台融合的首选框架。很长一段时间的自适应还是需要我们程序员来实现的,并且也没有完美方案。

preview

自适应这块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来说,这不难。

收获园豆:200
楚人Leo | 小虾三级 |园豆:803 | 2020-07-02 12:06

抱歉 才看到。我可以按照百分比布局,之前也是这样做的。但是产品那边非要自适应所有屏幕,要按1920*1080的设计图来,所有控件尺寸都是固定的。刚开始这样做也没什么问题。所有内容都按预期的样子展示了。只有 文本框和 富文本框的 输入光标 会偶尔消失。我查了下是因为viewbox内部的缩放规则导致的。 文本框我自己处理了。画了个输入光标 通过定位也可以定位到正确的地方。但是richtextbox 这个不好处理,虽然也可以自己画一个光标,但是定位不太好定位。所以才来问一下有没有什么好的方法

飞翔的猪小猪 | 园豆:3 (初学一级) | 2020-07-06 11:30

@阿里啪啪☺:
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 | 园豆:803 (小虾三级) | 2020-07-06 15:26

@楚人Leo: 好吧。我再研究一下。现在已经是在 整个窗体最外层 放了一个viewbox。重改的话 改动还是挺大的。。为了一个文本框 不值得~~。太难了 看来viewbox 只能缩放 除了用户输入 之外的东西。。

飞翔的猪小猪 | 园豆:3 (初学一级) | 2020-07-06 16:16

@阿里啪啪☺: 我们一般自定义Chart、仪表控件时Viewbox用得多点,这些控件在显示空间不足时进行一定层度保留横纵比的缩放,超过缩放阈值也会裁剪内容,不会无限缩放下去。

楚人Leo | 园豆:803 (小虾三级) | 2020-07-11 21:33

@楚人Leo: 好的大佬,明天研究研究😁 😁 😁

飞翔的猪小猪 | 园豆:3 (初学一级) | 2020-07-11 22:37
其他回答(2)
0

.....TextBox 的高度设高一点,有时候设计图和实际是不一样的...

猝不及防 | 园豆:2781 (老鸟四级) | 2020-06-30 16:33
0

既如此你搞一个粗大的光标试试不就行了。

花飘水流兮 | 园豆:13560 (专家六级) | 2020-07-01 15:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册