在XAML中,是否可以为输入框设置键盘以进行“句子大写”?

5
我正在查看Xamarin.Forms:指定其他键盘选项,并发现了这段代码,用于将键盘标志设置为“句子大写”。
Content = new StackLayout
{
    Padding = new Thickness(0, 20, 0, 0),
    Children =
    {
        new Entry
        {
          Keyboard = Keyboard.Create(KeyboardFlags.CapitalizeSentence)
        }
    }
};

这看起来很不错,我想在XAML中使用它。

在XAML中是否可以做到这一点?

2个回答

7

正如第一个答案中所正确提到的,设置键盘标志位不能直接完成。虽然您可以创建Entry的子类,但更优雅的方法是创建一个附加属性

public class KeyboardStyle
    {
        public static BindableProperty KeyboardFlagsProperty = BindableProperty.CreateAttached(
            propertyName: "KeyboardFlags",
            returnType: typeof(string),
            declaringType: typeof(InputView),
            defaultValue: null,
            defaultBindingMode: BindingMode.OneWay,
            propertyChanged: HandleKeyboardFlagsChanged);

        public static void HandleKeyboardFlagsChanged(BindableObject obj, object oldValue, object newValue)
        {
            var entry = obj as InputView;

            if(entry == null)
            {
                return;
            }

            if(newValue == null)
            {
                return;
            }

            string[] flagNames = ((string)newValue).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            KeyboardFlags allFlags = 0;

            foreach (var flagName in flagNames) {
                KeyboardFlags flags = 0;
                Enum.TryParse<KeyboardFlags>(flagName.Trim(), out flags);
                if(flags != 0)
                {
                    allFlags |= flags;      
                }
            }

            Debug.WriteLine("Setting keyboard to: " + allFlags);
            var keyboard = Keyboard.Create(allFlags);

            entry.Keyboard = keyboard;
        }
    }

然后在XAML中使用它(不要忘记添加local命名空间):

<?xml version="1.0" encoding="utf-8"?>
<ContentPage
        xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:local="clr-namespace:KeyboardTest"
        x:Class="KeyboardTest.KeyboardTestPage">

    <Entry x:Name="entry" Text="Hello Keyboard" local:KeyboardStyle.KeyboardFlags="Spellcheck,CapitalizeSentence"/>
</ContentPage>

您也可以将其作为毛毯样式的一部分使用,如下所示:

<Style TargetType="Entry">
    <Setter Property="local:KeyboardStyle.KeyboardFlags"
            Value="Spellcheck,CapitalizeSentence"/>
</Style>

1
哇,这是一个好主意。我完全忘记了附加属性! - JKennedy
1
关于附加属性的跟进问题,只是一个问题。是否可以将它们设置为空白样式的一部分?即使用TargetType,还是必须为每个Entry元素设置这些属性? - JKennedy

1

直到现在在XAML中还不能这样做。

你必须通过编程来实现。

更多信息请参考KeyboardFlags

作为建议,您可以扩展Entry和该属性。


1
哦,那太糟糕了。我可能会编写自己的控件,将标志公开为可绑定属性,然后在代码中设置键盘以允许我在XAML中完成。当我开始时,我会在这里发布它。 - JKennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接