Reputation: 1381
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
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
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
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