2017-09-29 13 views
3

UWPアプリケーション(Windows 10用)のTextBoxにユーザーが入力したテキストを強制的に大文字にしたいとします。 WinFormsとWPFの両方には、CharacterCasingで組み込みを行うための簡単な方法がありますが、UWPではできません。UWPでテキストボックスを大文字にする(Windows 10)

2つの異なる方法を試しました。 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(); 
     } 
    } 
} 

答えて

2

は、ここで私はそれを行うだろう方法です。

TextBoxから継承され、どこでも使用できるようにTemplatedControl内のTextChangedイベントを管理するTemplatedControlを作成します。また、テキストを大文字にするかどうかを決定するPropertyを作成します。そうすれば、私は必要なすべての場所で同じコントロールを使うことができます。以下は

は、私は列挙型は、ユーザーがテキストを入力したときTextBoxは尊重すべきかを決定しますケースCaseTypeと呼ば作成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 
    } 
} 

継承されていますシンプルなテキストボックスです。

TextChangedイベントでは、Enumに基づいてテキストをCaseConvertingしています。

これはXAMLで以下のように使用できます。

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

あなたの要件ごとCaseConvertingのためのより多くのオプションを持つコントロールを拡張することができます。

Good Luck。


更新

ここGithubレポです。あなたがしていることを自由にダウンロードして比較してください。

+2

TextChangingイベントを使用して、入力されたテキストを取得し、大文字のバージョンを返すことができます。このイベントを使用すると、元の小文字がTextChangedのようにタイプされて削除されていることがわかりません。 – jsmyth886

+1

@ jsmyth886 'CharacterCasing'を' Upper'に設定するとWPFで 'TextChanged'の代わりに' TextChanged'を明示的に使用しました。何かを入力すると、元の入力テキストが下に表示されず、上に変更されます。ストレートに大文字が表示されます。私はここでそれを複製したかったのです。 – AVK

+0

@AVK - コードは機能し、大文字にしますが、コードビハインドから新しいコントロールにアクセスすることはできません。たぶん私は何かが欠けているかもしれませんが、コードビハインドからテキスト値を取得しようとすると(たとえば:string sWhatWasTyped = txtExample。テキスト; )私はエラーが表示されます:名前 'txtExample2'は現在のコンテキストに存在しません。 – ThePeter

関連する問題