【问题标题】:Force textbox to be uppercase in UWP (Windows 10)在 UWP 中强制文本框为大写(Windows 10)
【发布时间】:2018-03-11 12:52:51
【问题描述】:

我想强制用户在 UWP 应用(适用于 Windows 10)上的 TextBox 中输入的文本为大写。 WinForms 和 WPF 都通过内置 CharacterCasing 提供了一种简单的方法来执行此操作,但 UWP 没有。

我尝试了两种不同的方法; AlexDrenea 的在线示例,我自己构建了一个转换器。在这两种情况下,我发现当我在文本框中输入“test”时,文本变得混乱(例如,“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();
        }
    }
}

【问题讨论】:

  • 请注意,由于提出了这个问题,UWP 似乎也实现了 CharacterCasing 属性。

标签: c# uwp converter uppercase


【解决方案1】:

我会这样做。

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

下面是一个简单的TextBox继承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事件中,我是根据Enum对文本进行CaseConverting。

您可以在 XAML 中使用它,如下所示。

<local:MyTextBox HorizontalAlignment="Center"
                 VerticalAlignment="Center"
                 CharacterCasing="UpperCase"/>

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

祝你好运。


更新

这是一个Github 回购。随意下载并与您正在做的比较。

【讨论】:

  • 您可以使用 TextChanging 事件来获取输入的文本并返回大写版本。使用此事件意味着您甚至不会像 TextChanged 那样看到输入和删除的原始小写字母
  • @jsmyth886 我明确地使用了TextChanged 而不是TextChanging,因为在WPF 中,当您将CharacterCasing 设置为Upper 时,当您键入内容时,它不会在较低和然后将其更改为上。它会立即显示大写。我想在这里复制同样的内容。
  • @AVK - 代码可以正常工作,并且确实将其设为大写,但我无法从代码隐藏中访问新控件。也许我遗漏了一些东西,但如果我尝试从代码隐藏中获取文本值(例如:string sWhatWasTyped = txtExample.Text;)我得到错误:当前上下文中不存在名称'txtExample2'。跨度>
  • @ThePeter 您如何从您的代码隐藏访问txtExample2?你能更新你的问题吗?
  • @ThePeter 并访问控件,如果您将其放在单独的 Namespace 中,请确保在代码后面添加该命名空间。
【解决方案2】:

我使用文本框的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;
            }
        }

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2011-01-02
    • 2010-09-17
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2017-07-18
    • 2016-05-27
    • 2018-10-01
    相关资源
    最近更新 更多