xamarin forms中的Button文本默认大写
问题来源
使用xamarin forms创建的android项目中,Button、Toolbar的右侧菜单按钮上的如果是字母的话,在android5.0以上,默认的文本都是大写,这种情况iOS项目不存在,是正常的显示。google公司把android的按钮文本默认大写,这个肯定和英语国家阅读习惯有关,但是iOS却是正常显示,有点难以解释google为什么将android的按钮文本默认成大写。问题如图:

分析
其实这个问题的产生的原因还是因为 在5.0中在Button使用的Theme是这个,默认已经textAllCaps改为true了。
<style name="TextAppearance.Material.Button">
<item name="textSize">@dimen/text_size_button_material</item>
<item name="fontFamily">@string/font_family_button_material</item>
<item name="textAllCaps">true</item>
<item name="textColor">?attr/textColorPrimary</item>
</style>
在android中我们只需要将按钮的属性textAllCaps都改为false就可以了,最好还是全局设置这个属性,直接在Activity的Theme中去设置就行了。
那在xamarin forms中如何解决呢?
解决方法
Button 和Toolbar的按钮文本都是默认的大写,问题的解决方式有两种,第一种是直接android项目中的MainActivity的Theme中去全局添加样式,
第二种方式在xamarin forms中使用Render这些UI,不管哪种方式都能解决,个人推荐既然要改变这种默认样式,还是直接在全局Theme中去设置样式吧。
1.android MainActivity的Theme修改样式textAllCaps
这个新建的xamarin forms项目中的android项目的默认的Theme,添加样式最后一行,这样可以修改Button和Toolbar的按钮文本默认大写,但是.......有个小问题,TabLayout的标题文本还是会默认大写,如下:
<style name="MainTheme" parent="MainTheme.Base">
</style>
<!-- Base theme applied no matter what API -->
<style name="MainTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<!--If you are using revision 22.1 please use just windowNoTitle. Without android:-->
<item name="windowNoTitle">true</item>
<!--We will be using the toolbar so no need to show ActionBar-->
<item name="windowActionBar">false</item>
<!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette -->
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">#2196F3</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">#1976D2</item>
<!-- colorAccent is used as the default value for colorControlActivated
which is used to tint widgets -->
<item name="colorAccent">#FF4081</item>
<!-- You can also set colorControlNormal, colorControlActivated
colorControlHighlight and colorSwitchThumbNormal. -->
<item name="windowActionModeOverlay">true</item>
<item name="android:datePickerDialogTheme">@style/AppCompatDialogStyle</item>
<item name="textAllCaps">false</item>
</style>
2.使用Render Button 设置属性textAllCaps
Render的目的就是自定义各平台的UI展现,相关的介绍如下:
https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/custom-renderer/renderers
render button的步骤如下:
step1:在forms的.net standard 项目中添加MyButton.cs ,继承xamarin forms 的Button。
using Xamarin.Forms;
namespace DefaultUpperSample
{
public class MyButton:Button
{
}
}
step2 在android项目新建MyButtonRender.cs,修改默认属性。
继承ViewRenderer时一定要重写OnElementChanged方法,这个方法的作用是创建UI元素,会在UI初始化时调用。注意命名空间上的特性定义,iOS平台上不需要处理,就不用去处理。
[assembly: ExportRenderer(typeof(DefaultUpperSample.MyButton), typeof(DefaultUpperSample.Droid.MyButtonRender))]
[assembly: ExportRenderer(typeof(ButtonTextDefaultUpperSample.MyButton), typeof(ButtonTextDefaultUpperSample.Droid.MyButtonRender))]
namespace DefaultUpperSample.Droid
{
public class MyButtonRender:ButtonRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
{
base.OnElementChanged(e);
if (Control == null)
{
SetNativeControl(new Android.Widget.Button(Context));
}
else
{
Control.SetAllCaps(false);
}
}
}
}
step3 在forms中使用如下:
<defaultuppersample:MyButton Margin="0,10,0,0" Text="Learn more"
Command="{Binding OpenWebCommand}"
BackgroundColor="{StaticResource Primary}"
TextColor="White" />
效果图如下:

代码下载地址:
https://download.csdn.net/download/kebi007/10790030
总结
其实第一种方法直接在android里面写style更为靠谱,不用一个一个render ui,但是第一种方法会有一个问题,就是toolbar、button的文本修改样式textAllCaps可以解决默认大写的问题,但是TabLayout的标题文本却不能通过这个属性来解决,解决方式是一样的,这种文体在android中非常容易,一百度全都出来了,但是在xamarin forms中有时候总要走很多弯路。
有兴趣关注一下我的个人公众号“dotNet全栈开发”,专注dotNet。

xamarin forms中的Button文本默认大写的更多相关文章
- Xamarin Forms中WebView的自适应高度
在Xamarin.Forms中,WebView如果嵌套在StackLayout和RelativeLayout中必须要设置HeightRequest和WidthRequest属性才会进行渲染.可是在实际 ...
- Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色
Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色 在图12.10~12.12中我们会看到在各个平台下活动指示器的颜色是不一样的.Android的活动指示器默认是深粉色的: ...
- Xamarin XAML语言教程Xamarin.Forms中活动指示器的显示隐藏
Xamarin XAML语言教程Xamarin.Forms中活动指示器的显示隐藏 开发者除了可以在XAML中使用IsRunning属性控制指示器的显示隐藏外,还可以在代码隐藏文件中使用IsRunnin ...
- Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一)
Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一) 在Xamarin.Forms中,提供了两个控件用来指示程序的状态和进度.他们分别为活动指示器和进度条.其中,活动指示器 ...
- Xamarin.Forms中的ListView的ItemTrapped事件与ItemSelected事件的区别
今天对Xamarin.Forms中的ListView的两个事件(ItemTrapped和ItemSelected)做了小小的研究,发现有以下几点区别: 1.ItemTrapped事件会优先被触发. 2 ...
- 关于xamarin.forms 中 list 的loadmore
前言 最近几天在研究上拉加载啊,下拉刷新啊什么的.然而坑爹的事情总是那么多.在xamarin.forms中,list自带的,并没有上拉加载的这个属性(难道当初他们封装方法时,就不会想到数据多了会咋整吗 ...
- Xamarin XAML语言教程Xamarin.Forms中构建进度条
Xamarin XAML语言教程Xamarin.Forms中构建进度条 ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度条总是水平放置的.本节将讲解如何使用进度条. 注意:进度条在 ...
- Xamarin.Forms中为WebView指定数据来源Source
Xamarin.Forms中为WebView指定数据来源Source 网页视图WebView用来显示HTML和网页形式内容.使用这种方式,可以借助网页形式进行界面设计,并利于更新和维护.WebVi ...
- IE 中的 button type默认值问题
今天遇到一个问题. 将项目页面的渲染模式从 IE7 改为 IE10 后(<meta http-equiv="X-UA-Compatible" content="IE ...
随机推荐
- 使用nginx缓存服务器上的静态文件
一.nginx缓存的优点 如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力. 因为静态文件(比如css,js, 图片)中,很多都是不经常更新的.nginx使用proxy_cach ...
- DevOps之五 Tomcat的安装与配置
安装说明 安装环境:CentOS-7 安装方式:源码安装 软件:apache-tomcat-9 下载地址:https://tomcat.apache.org/download-90.cgi 一.安装t ...
- flume安装及入门实例
1. 如何安装? 1)将下载的flume包,解压到/home/hadoop目录中 2)修改 flume-env.sh 配置文件,主要是JAVA_HOME变量设置 root@m1:/home/hadoo ...
- MySQL索引的使用
1.创建和查看索引 所谓普通索引,就是在创建索引时,不附加任何限制条件(唯一.非空等限制).该类型的索引可以创建在任何数据类型的字段上. (1)创建表时,创建普通索引 语法: 例子: (2)在已经存在 ...
- 转 Web用户的身份验证及WebApi权限验证流程的设计和实现
前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...
- js基础进阶--关于Array.prototype.slice.call(arguments) 的思考
欢迎访问我的个人博客:http://www.xiaolongwu.cn Array.prototype.slice.call(arguments)的作用为:强制转化arguments为数组格式,一般出 ...
- 多进程IPC与Python支持
多进程IPC与Python支持 linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因 ...
- 关于springboot的定时器配置
关于springboot的定时器: 比较重要的两个注解: @EnableScheduling:标注启动定时任务. @Scheduled(fixedRate = 1000 * 30) 定义某个定时任务 ...
- DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)
这篇文章入选CSDN极客头条 http://geek.csdn.net/news/detail/71572 当前,要保证业务的市场竞争力,仅靠设计一个可用并且好看的产品,已经完全不能满足要求.全球消费 ...
- retry.go
package clientv3 import ( "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" p ...