2013-07-23 3 views
1

Мне нужен пароль с числовой областью ввода. К сожалению, PasswordBox не позволяет разработчикам указывать числовой InputScope. Итак, я достиг этой цели, настроив TextBox. Мой код находится здесь, MainPage.xaml.csПочему свойство TextBox MaxLength не работает для настраиваемого TextBox?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using Microsoft.Phone.Controls; 
using System.Text.RegularExpressions; 

namespace PaswwordBoxwithNumericInput 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
     // Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 

     } 

    string _enteredPasscode = ""; 
    string _passwordChar = "*"; 

    private void PasswordTextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
     //modify new passcode according to entered key 
     _enteredPasscode = GetNewPasscode(_enteredPasscode, e.PlatformKeyCode); 

     //replace text by * 
     PasswordTextBox.Text = Regex.Replace(_enteredPasscode, @".", _passwordChar); 

     //take cursor to end of string 
     TextBox t = new TextBox(); 
     // PasswordTextBox.SelectionStart = t.Text.Length; 
    } 
    private string GetNewPasscode(string oldPasscode, int keyId) 
    { 
     string newPasscode = string.Empty; 
     switch (keyId) 
     { 
      case 233: 
       newPasscode = oldPasscode; 
       break; 
      case 8: 
       //back key pressed 
       if (oldPasscode.Length > 0) 
        newPasscode = oldPasscode.Substring(0, oldPasscode.Length - 1); 
       break; 
      case 190: 
       // . pressed 
       newPasscode = oldPasscode; 
       break; 
      default: 
       //Number pressed 
       newPasscode = oldPasscode + (keyId - 48); 
       break; 
     } 
     return newPasscode; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     string str = _enteredPasscode; 
    } 
} 

}

и MainPage.xaml здесь

<phone:PhoneApplicationPage 
    x:Class="PaswwordBoxwithNumericInput.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
    FontFamily="{StaticResource PhoneFontFamilyNormal}" 
    FontSize="{StaticResource PhoneFontSizeNormal}" 
    Foreground="{StaticResource PhoneForegroundBrush}" 
    SupportedOrientations="Portrait" Orientation="Portrait" 
    shell:SystemTray.IsVisible="True"> 

    <!--LayoutRoot is the root grid where all page content is placed--> 
    <Grid x:Name="LayoutRoot" Background="Transparent"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <!--TitlePanel contains the name of the application and page title--> 
     <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 
      <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> 
      <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
     </StackPanel> 

     <!--ContentPanel - place additional content here--> 
     <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
      <TextBox Height="72" HorizontalAlignment="Left" Margin="42,189,0,0" Name="PasswordTextBox" VerticalAlignment="Top" Width="374" MaxLength="6" InputScope="Number" KeyUp="PasswordTextBox_KeyUp"> 



      </TextBox> 
      <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="221,436,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" /> 
     </Grid> 

    </Grid> 

    <!--Sample code showing usage of ApplicationBar--> 
    <!--<phone:PhoneApplicationPage.ApplicationBar> 
     <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> 
      <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/> 
      <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/> 
      <shell:ApplicationBar.MenuItems> 
       <shell:ApplicationBarMenuItem Text="MenuItem 1"/> 
       <shell:ApplicationBarMenuItem Text="MenuItem 2"/> 
      </shell:ApplicationBar.MenuItems> 
     </shell:ApplicationBar> 
    </phone:PhoneApplicationPage.ApplicationBar>--> 

</phone:PhoneApplicationPage> 

Все хорошо, за исключением двух проблем. 1) Я установил MaxLength TextBox на номер исправления, но его не работает (я могу добавить текст TextBox более 6). 2) Когда я набираю TextBox, курсор не перемещается (он фиксируется в первой позиции). Это не хорошо для пользователей. Пожалуйста, помогите мне разобраться в обеих этих проблемах.

ответ

0

Вы можете указать область ввода только для TextBox. Причина не наличие этой функции для PasswordBox что

The input scope gives the clear idea about the character type. Hence hacker can easily identify that your password consist of only numeric and that makes him to know your password easily.

+0

Это хорошо, но мой вопрос что-то другое, я не прошу для ввода объема здесь, я спрашиваю, как исправить MaxLength пароля, так что пользователь не может ввести пароль более нужной длины , – shaby

0

Вы должны использовать этот код

private void txtCardName_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     _enteredPasscode = Utility.GetNewPasscode(_enteredPasscode, e); 
     if (!string.IsNullOrEmpty(_enteredPasscode) && _enteredPasscode.Length < 13) 
     { 
      TextBoxPinCode.Text = Regex.Replace(_enteredPasscode, @".", _passwordChar); 
      TextBoxPinCode.SelectionStart = TextBoxPinCode.Text.Length;  
     } 

    } 

мы должны проверить в Key_Up Event, и проверьте длину _enterPasscode меньше, чем ваши ограничения ,

1

Попробуйте это, оно будет работать так, как вы хотите. PasswordBox с MaxLength для Windows Phone.

int maxLength = 4; 
string _enteredPasscode = ""; 
string _passwordChar = "*"; 

    private void PasswordTextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (PasswordTextBox.Text.Length > 4) 
     { 
      // Set Text to previous text of length 4 
      PasswordTextBox.Text = System.Text.RegularExpressions.Regex.Replace(_enteredPasscode, @".", _passwordChar); 
      //take cursor to end of string 
      PasswordTextBox.SelectionStart = PasswordTextBox.Text.Length; 

      e.Handled = false; 
      return; 
     } 

     //modify new passcode according to entered key 
     _enteredPasscode = GetNewPasscode(_enteredPasscode, e); 
     //replace text by * 
     PasswordTextBox.Text = System.Text.RegularExpressions.Regex.Replace(_enteredPasscode, @".", _passwordChar); 
     //take cursor to end of string 
     PasswordTextBox.SelectionStart = PasswordTextBox.Text.Length; 
    } 

     private string GetNewPasscode(string oldPasscode, System.Windows.Input.KeyEventArgs keyEventArgs) 
    { 
     string newPasscode = string.Empty; 
     switch (keyEventArgs.Key) 
     { 
      case Key.D0: 
      case Key.D1: 
      case Key.D2: 
      case Key.D3: 
      case Key.D4: 
      case Key.D5: 
      case Key.D6: 
      case Key.D7: 
      case Key.D8: 
      case Key.D9: 
       newPasscode = oldPasscode + (keyEventArgs.PlatformKeyCode - 48); 
       break; 
      case Key.Back: 
       if (oldPasscode.Length > 0) 
        newPasscode = oldPasscode.Substring(0, oldPasscode.Length - 1); 
       break; 
      default: 
       //others 
       newPasscode = oldPasscode; 
       break; 
     } 
     return newPasscode; 
    } 
Смежные вопросы