Xamarin.Forms - 可以全局设置元素属性吗?

时间:2016-03-08 19:05:05

标签: c# xamarin xamarin.forms monkeypatching

假设我想要一个Entry元素没有自动更正或自动大写。这可以通过设置其Keyboard属性来完成:

new Entry { Keyboard = Keyboard.Create(0) }

现在,如何使所有条目元素的全局默认值

我知道我可以创建一个继承自内置元素的自定义元素,并以这种方式覆盖属性,如:

public class EntryCustom : Entry
{
    public EntryCustom()
    {
        Keyboard = Keyboard.Create(0);
    }
}

然后简单地称之为:

new EntryCustom { ... }

但有没有办法直接在内置元素类型上执行此操作,而无需创建自定义元素类型?

1 个答案:

答案 0 :(得分:2)

您可以将自定义键盘保存为静态,然后使用默认样式将其绑定到所有Entry字段。您可以将该默认样式放入应用程序范围的资源字典中,该字典会自动应用于整个应用程序。以下是我刚测试在新的空Forms项目中验证的示例代码:

步骤1.将自定义键盘保存为静态。

Keyboards.cs(静态自定义键盘):

using Xamarin.Forms;

namespace KeyboardDemo
{
    public static class Keyboards
    {
        public static Keyboard Unassisted { get; private set; }

        static Keyboards ()
        {
            Unassisted = Keyboard.Create (0);
        }
    }
}

步骤2.为您的项目创建App.xaml。

按照此提示将App.xaml添加到您的Forms项目:http://jfarrell.net/2015/02/02/centralize-your-styles-with-xamarin-forms/

步骤3.将默认样式添加到App.xaml

的App.xaml:

<?xml version="1.0" encoding="UTF-8"?>
<Application 
        xmlns="http://xamarin.com/schemas/2014/forms" 
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
        xmlns:demo="clr-namespace:KeyboardDemo" 
        x:Class="KeyboardDemo.App">

    <Application.Resources>
        <ResourceDictionary>
            <Style x:Key="EntryStyle" TargetType="Entry">
                <Setter Property="Keyboard" Value="{x:Static demo:Keyboards.Unassisted}" />
            </Style>
            <Style BasedOn="{StaticResource EntryStyle}" TargetType="Entry" />
        </ResourceDictionary>
    </Application.Resources>

</Application>

步骤4.向项目添加新页面

将ContentPage添加到应用程序,使用普通的Entry控件来验证样式。

App.xaml.cs:

using Xamarin.Forms;

namespace KeyboardDemo
{
    public partial class App : Application
    {
        public App ()
        {
            InitializeComponent ();
            MainPage = new MyPage ();
        }
    }
}

MyPage.xaml:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage 
        xmlns="http://xamarin.com/schemas/2014/forms" 
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
        x:Class="KeyboardDemo.MyPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness" iOS="0,20,0,0" Android="0" WinPhone="0" />
    </ContentPage.Padding>

    <StackLayout>
        <Entry />
    </StackLayout>
</ContentPage>