2013-07-23 55 views
1

我想要一個帶有數字輸入範圍的密碼框,不幸的是,PasswordBox不允許開發者指定一個數字InputScope。 所以我通過自定義TextBox達到了這個目的。 我的代碼是在這裏,MainPage.xaml.cs中爲什麼TextBox屬性MaxLength不適用於自定義文本框?

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)我已經將TextBox的MaxLength設置爲固定編號,但它不工作(我可以將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

這沒什麼,但我的問題是不同的,我不是要求輸入範圍在這裏,我問如何修復密碼的最大長度,以便用戶不能輸入超過所需長度的密碼。 – 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事件,並檢查lenght比你限制_enterPasscode少,

1

試試這個,它會工作,你想要的。帶有用於Windows Phone的MaxLength的PasswordBox。

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; 
    } 
相關問題