我想强制用户输入的文本在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();
}
}
}
答案 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;
}
}