强制文本框在UWP中为大写(Windows 10)

时间:2017-09-29 15:10:06

标签: c# uwp converter uppercase

我想强制用户输入的文本在UWP应用程序(对于Windows 10)上的TextBox为大写。使用内置的CharacterCasing,WinForms和WPF都有一个简单的方法,但是UWP没有。

我尝试了两种不同的方法; AlexDrenea的在线示例,我自己构建了一个转换器。在这两种情况下,我发现当我输入" test"在文本框中,文本变得混乱(例如,"测试"显示为" TSTE")。

我真的认为转换器会起作用。有什么建议可以改进它以便它们不会混淆信件吗?

XAML

<Page
    x:Class="MakeUppercaseEx2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MakeUppercaseEx2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Page.Resources>
        <local:TextToUppercaseConverter x:Name="MyUppercaseConverter" />
    </Page.Resources>

    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBox Name="txtExample2" Margin="10" Text="{Binding ElementName=txtExample2, Path=Text, Converter={StaticResource MyUppercaseConverter}}" />
        <Button Name="btnDisplay" Margin="10" Content="Display" Click="btnDisplay_Click"/>
        <TextBlock Name="lblStatus" Margin="10" Text="" />
    </StackPanel>
</Page>

代码隐藏

using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;

namespace MakeUppercaseEx2
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void btnDisplay_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) {
            lblStatus.Text = "You entered: " + txtExample2.Text;
        }
    }

    public class TextToUppercaseConverter : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, string language) {
            string sTypedValue = System.Convert.ToString(value);
            if (string.IsNullOrEmpty(sTypedValue)) {
                return "";
            }
            return sTypedValue.ToUpper();
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language) {
            throw new NotImplementedException();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我将如何做到这一点。

我将创建一个继承自TemplatedControl的{​​{1}},并管理TextBox内的TextChanged个事件,以便可以在任何地方使用它。另外,我会创建一个属性来确定我是否希望文本大写。这样我就可以在所有必要的地方使用相同的控件。

下面是一个简单的TextBox Inherited TemplatedControl

TemplatedControl

我创建了一个名为public sealed class MyTextBox : TextBox { public MyTextBox() { this.DefaultStyleKey = typeof(TextBox); } public CaseType CharacterCasing { get { return (CaseType)GetValue(CharacterCasingProperty); } set { SetValue(CharacterCasingProperty, value); } } public static readonly DependencyProperty CharacterCasingProperty = DependencyProperty.Register("CharacterCasing", typeof(CaseType), typeof(MyTextBox), new PropertyMetadata(CaseType.Normal,(s,e)=> { TextBox myTextBox = (TextBox)s; if ((CaseType)e.NewValue !=(CaseType)e.OldValue) { myTextBox.TextChanged += MyTextBox_TextChanged; } else { myTextBox.TextChanged -= MyTextBox_TextChanged; } })); private static void MyTextBox_TextChanged(object sender, TextChangedEventArgs e) { MyTextBox myTextBox = sender as MyTextBox; switch(myTextBox.CharacterCasing) { case CaseType.UpperCase: myTextBox.Text = myTextBox.Text.ToUpper(); break; case CaseType.LowerCase: myTextBox.Text = myTextBox.Text.ToLower(); break; default: break; } myTextBox.SelectionStart = myTextBox.Text.Length; } public enum CaseType { Normal, UpperCase, LowerCase } } 的枚举,用于确定用户输入文字时CaseType应该尊重的情况。

TextBox事件中,我根据TextChanged CaseConverting文本。

您可以在XAML中使用此功能,如下所示。

Enum

您可以根据需要使用更多CaseConverting选项扩展控件。

祝你好运。

<强>更新

这是Github回购。随意下载并与您正在做的事情进行比较。

答案 1 :(得分:0)

我使用文本框的 CharacterReceived 事件

private void TextBox_CharacterReceived(UIElement sender, CharacterReceivedRoutedEventArgs args)
        {
            TextBox TBx = (TextBox)sender;

            if (char.IsLower(args.Character))
            {
                int Pos = TBx.SelectionStart;
                TBx.Text = TBx.Text.ToUpper();
                TBx.SelectionStart = Pos;
                args.Handled = true;
            }
        }