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" />

效果图如下:

代码下载地址:

总结

其实第一种方法直接在android里面写style更为靠谱,不用一个一个render ui,但是第一种方法会有一个问题,就是toolbar、button的文本修改样式textAllCaps可以解决默认大写的问题,但是TabLayout的标题文本却不能通过这个属性来解决,解决方式是一样的,这种文体在android中非常容易,一百度全都出来了,但是在xamarin forms中有时候总要走很多弯路。

原文地址:https://www.cnblogs.com/zhangmumu/p/9972579.html

时间: 2024-10-29 01:12:03

xamarin forms中的Button文本默认大写的相关文章

Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色

Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色 在图12.10~12.12中我们会看到在各个平台下活动指示器的颜色是不一样的.Android的活动指示器默认是深粉色的:iOS的活动指示器是灰色的:Windows Phone的活动指示器是蓝色的.如果开发者想要让各个平台下活动指示器的颜色统一,可以使用ActivityIndicator定义的Color属性,其语法形式如下: <ActivityIndicator Color="activityIndicatorC

Xamarin.Forms 监听Button的按下、释放事件

Xamarin.Forms 监听Button的按下.释放事件 工作中遇到这样的一个需求,模仿微信发生语音功能,需要实现按钮按下开始录音,按钮释放录音结束, Xamarin.Forms中Button没有这样的事件,那么我们如何实现对Button按下,释放两个事件的监听呢? 当然这里我们再次用到了CustomRenderer,一旦遇到Xamrin.Forms无法实现的某些功能,我们就可以 通过CustomRenderer来处理. 首先:我们自定义一个VoiceRecordButton继承于Butto

Xamarin.Forms中DependencyService的使用

Xamarin.Forms中DependencyService的使用 在Xamarin.Forms中,我们经常会根据各个平台的特性特殊处理一些需求,比如:读取应用的版本号. 在此也以读取应用版本号为例,练习DependencyService用法: 创建IPlatformInfoService接口: 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace XFPractice.Se

Andrioid FileProvider在Xamarin.Forms中的使用

Andrioid FileProvider在Xamarin.Forms中的使用 Android 7.0到来后,为了进一步提高私有文件的安全性,Android不再由开发者放宽私有文件的访问权限,之前我们一直使用"file:///"绝对路径来传递文件地址的方式, 在接收方访问时会触发SecurityException的异常. 因此在提供文件给第三方应用访问时,我们就会用到FileProvider. FileProvider使用方法: 1.在AndroidManifest.xml里声明Pro

Xamarin.Forms中实现CheckBox控件

Xamarin.Forms中实现CheckBox控件 由于Xamarin.Forms中没有Checkbox这个基础控件,我们就只能自己来实现啦! 这里采用的是继承Image来实现Checkbox控件,代码如下所示: IconUnChecked :未选中状态的图片名称 IconChecked:选中状态的图片名称 using System; using System.Collections.Generic; using System.ComponentModel; using System.Text

Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装

Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装 在移动应用开发中,经常需要判断一个app是否安装,iOS中有什么方式可以判断app是否安装呢? 这里介绍通过Url Scheme来判断应用是否安装. Url Scheme在这里就不详讲了,可以看文章URL Schemes 使用详解. 首先我们来看看在原生iOS开发中Objective-C如何编写判断代码: if ([[UIApplication sharedApplication] canOpenURL:[NSURL

Xamarin.Forms中 Navigation,NavigationPage详解

1.Xamarin Forms下有四个成员类:Element,VisualElement,Page,NavigationPage 基类为Element,继承的子类分别是VisualElement,Page,NavigationPage. 2.Navigation 为VisualElement的一个成员对象,该对象是INavigation接口类型的. 3.INavigation接口中有5个方法,如下 namespace Xamarin.Forms { public interface INavig

Xamarin.Forms中为WebView指定数据来源Source

网页视图WebView用来显示HTML和网页形式内容.使用这种方式,可以借助网页形式进行界面设计,并利于更新和维护.WebView从数据来源读取内容,并进行显示.WebView支持三种数据来源,分别为网站的网页.HTML代码和本地HTML文件.这三种形式都通过Source属性进行设置.在设置这三种形式来源,需要注意以下问题: 第一,使用网站网页,需要指定该网页的完整路径,包括http://或者https://部分. 第二,使用HTML代码,需要将该内容保存为一个字符串.在赋值的时候,使用@符号标

Xamarin.Forms之Button

为什么要讲Button,不管是何种UI系统,Button始终是一种很最常见的控件,但是Forms中得Button在使用的过程是出现了一些问题,特此记录一下 1.IsEnabled属性 即使设置了Button得背景色,当IsEnabled="false"的时候,背景色会变成灰色,文字也是会变成灰色 2.IsEnable属性无效的问题 的确有人遇到过这个问题,直接设置IsEnabled="false",Button居然该是可以点击,这就是一个BUG,截止到v2.2版本,