shaby
shaby

Reputation: 1381

Why TextBox property MaxLength is not working for a customised TextBox?

I wanted a password box with numeric input scope, Unfortunately the PasswordBox does not allow developers to specify a numeric InputScope. So I have achieved this objective through customize TextBox. My code is here,MainPage.xaml.cs

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;
    }
}

}

and MainPage.xaml is here

<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>

Everything is fine, except two problems. 1) I have set the MaxLength of TextBox to a fix number, but its not working(I can put TextBox's text more than 6). 2) When I am typing on TextBox, cursor is not moving(it is fixed on first position). It's not good from users perspective. Please help me to sort out both these problems.

Upvotes: 1

Views: 559

Answers (3)

Jatin
Jatin

Reputation: 462

Try this, it'll work as you want. A PasswordBox with MaxLength for 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;
    }

Upvotes: 1

user3425748
user3425748

Reputation: 1

You must Use this code

 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;    
        }

    }

we must check in Key_Up Event, and check the lenght _enterPasscode less than your limitation,

Upvotes: 0

Vijay.P
Vijay.P

Reputation: 126

You can specify input scope only for TextBox. The reason behind the not availability of this feature for passwordbox is that

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.

Upvotes: 0

Related Questions