Xamarin.Forms搭配Prism、MaterialDesign使用时DatePicker、TimePicker设置FontSize无效,如何修改内部文本字号?
问题原因
你碰到的FontSize设了完全没反应的情况,根本原因是项目里全局引入的MaterialDesign主题,给DatePicker、TimePicker内置了固定的文本样式规则——这套内置样式的优先级比直接写在控件标签上的属性值高,会直接把你手动设的字号给盖掉。TimePicker和DatePicker用的是同一套Material渲染逻辑,所以问题表现完全一样。
很多开发者会发现同样的控件,设置TextColor、BackgroundColor是能正常生效的,只有FontSize没反应——本质是MaterialDesign包做属性透传时,没有把外层的字号参数映射到内部的原生文本控件上,才会出现这种属性失效的错觉。
解决方法
方法1:页面级样式覆盖(改动最小,最推荐)
Xamarin.Forms的样式优先级规则里,页面里定义的、不设key的目标样式,优先级比App级全局主题的内置样式高,只要在当前页面的资源里加几行定义,被盖掉的字号设置立刻就能生效:
<!-- 放在ContentPage.Resources节点内 --> <ContentPage.Resources> <ResourceDictionary> <!-- 覆盖DatePicker的内置字号 --> <Style TargetType="DatePicker" ApplyToDerivedTypes="True"> <Setter Property="FontSize" Value="10" /> </Style> <!-- 覆盖TimePicker的内置字号 --> <Style TargetType="TimePicker" ApplyToDerivedTypes="True"> <Setter Property="FontSize" Value="10" /> </Style> </ResourceDictionary> </ContentPage.Resources>
这套写法的优势:
- 不用改安卓、iOS平台层面的原生主题代码
- 覆盖完成后,你之前直接写在控件标签上的
FontSize属性会恢复正常透传,后续给单个控件单独调字号也不会失效 - 如果需要全App统一改字号,直接把这两段样式移到App.xaml的全局资源里,和Prism的全局初始化流程绑一次就行,不用每个页面重复写
方法2:单控件单独指定样式
如果不想动页面级的全局规则,只需要调整某一个Picker的字号,直接给控件显式挂自定义样式就行:
<DatePicker Date="{Binding mydate, Mode=TwoWay}" Style="{DynamicResource SmallFontPickerStyle}" FontSize="10" />
对应的样式定义和方法1里的Setter逻辑保持一致,只给需要调整的控件挂上,不会影响其他同类型控件的默认表现。
避坑提醒
别去改安卓端styles.xml、iOS端原生配置里的全局字号,这种改法会连带影响所有输入类控件的大小,灵活性很差,还容易和Prism的模块化资源逻辑冲突,远不如样式覆盖的方式可控。
内容的提问来源于stack exchange,提问作者KillemAll
相关产品推荐
相关产品推荐

