diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MaskedTextBox/Implementation/MaskedTextBox.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MaskedTextBox/Implementation/MaskedTextBox.cs index f32a9913..2cbb62a9 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MaskedTextBox/Implementation/MaskedTextBox.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/MaskedTextBox/Implementation/MaskedTextBox.cs @@ -1,13 +1,12 @@ using System; using System.ComponentModel; using System.Windows; -using System.Windows.Controls; using System.Windows.Input; -using Microsoft.Windows.Controls.Primitives; +using System.Windows.Controls; namespace Microsoft.Windows.Controls { - public class MaskedTextBox : InputBase + public class MaskedTextBox : TextBox { #region Members @@ -16,13 +15,13 @@ namespace Microsoft.Windows.Controls /// private bool _isSyncingTextAndValueProperties; private bool _isInitialized; + private bool _convertExceptionOccurred = false; #endregion //Members #region Properties protected MaskedTextProvider MaskProvider { get; set; } - private TextBox TextBox { get; set; } #region IncludePrompt @@ -94,6 +93,57 @@ namespace Microsoft.Windows.Controls #endregion //Mask + #region PromptChar + + public static readonly DependencyProperty PromptCharProperty = DependencyProperty.Register("PromptChar", typeof(char), typeof(MaskedTextBox), new UIPropertyMetadata('_', OnPromptCharChanged)); + public char PromptChar + { + get { return (char)GetValue(PromptCharProperty); } + set { SetValue(PromptCharProperty, value); } + } + + private static void OnPromptCharChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + MaskedTextBox maskedTextBox = o as MaskedTextBox; + if (maskedTextBox != null) + maskedTextBox.OnPromptCharChanged((char)e.OldValue, (char)e.NewValue); + } + + protected virtual void OnPromptCharChanged(char oldValue, char newValue) + { + ResolveMaskProvider(Mask); + } + + #endregion //PromptChar + + #region SelectAllOnGotFocus + + public static readonly DependencyProperty SelectAllOnGotFocusProperty = DependencyProperty.Register("SelectAllOnGotFocus", typeof(bool), typeof(MaskedTextBox), new PropertyMetadata(false)); + public bool SelectAllOnGotFocus + { + get { return (bool)GetValue(SelectAllOnGotFocusProperty); } + set { SetValue(SelectAllOnGotFocusProperty, value); } + } + + #endregion //SelectAllOnGotFocus + + #region Text + + private static void OnTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + MaskedTextBox inputBase = o as MaskedTextBox; + if (inputBase != null) + inputBase.OnTextChanged((string)e.OldValue, (string)e.NewValue); + } + + protected virtual void OnTextChanged(string oldValue, string newValue) + { + if (_isInitialized) + SyncTextAndValueProperties(MaskedTextBox.TextProperty, newValue); + } + + #endregion //Text + #region Value public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(object), typeof(MaskedTextBox), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged)); @@ -141,7 +191,7 @@ namespace Microsoft.Windows.Controls protected virtual void OnValueTypeChanged(Type oldValue, Type newValue) { if (_isInitialized) - SyncTextAndValueProperties(InputBase.TextProperty, Text); + SyncTextAndValueProperties(MaskedTextBox.TextProperty, Text); } #endregion //ValueType @@ -152,35 +202,24 @@ namespace Microsoft.Windows.Controls static MaskedTextBox() { - DefaultStyleKeyProperty.OverrideMetadata(typeof(MaskedTextBox), new FrameworkPropertyMetadata(typeof(MaskedTextBox))); + TextProperty.OverrideMetadata(typeof(MaskedTextBox), new FrameworkPropertyMetadata(OnTextChanged)); } #endregion //Constructors - #region Overrides + #region Base Class Overrides public override void OnApplyTemplate() { - TextBox = GetTemplateChild("TextBox") as TextBox; - TextBox.PreviewTextInput += TextBox_PreviewTextInput; - TextBox.PreviewKeyDown += TextBox_PreviewKeyDown; - - TextBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Paste)); //handle paste - TextBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.Cut, null, CanCut)); //surpress cut - } + base.OnApplyTemplate(); - protected override void OnAccessKey(AccessKeyEventArgs e) - { - if (TextBox != null) - TextBox.Focus(); + PreviewTextInput += TextBox_PreviewTextInput; + PreviewKeyDown += TextBox_PreviewKeyDown; - base.OnAccessKey(e); - } + CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Paste)); //handle paste + CommandBindings.Add(new CommandBinding(ApplicationCommands.Cut, null, CanCut)); //surpress cut - protected override void OnGotFocus(RoutedEventArgs e) - { - if (TextBox != null) - TextBox.Focus(); + UpdateText(MaskProvider, 0); } protected override void OnInitialized(EventArgs e) @@ -194,28 +233,42 @@ namespace Microsoft.Windows.Controls } } - protected override void OnTextChanged(string previousValue, string currentValue) + protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e) { - if (_isInitialized) - SyncTextAndValueProperties(InputBase.TextProperty, currentValue); + if (SelectAllOnGotFocus) + SelectAll(); + + base.OnGotKeyboardFocus(e); } - #endregion + protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) + { + if (!IsKeyboardFocused) + { + e.Handled = true; + Focus(); + } + + base.OnPreviewMouseLeftButtonDown(e); + } + + #endregion //Base Class Overrides #region Event Handlers void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { //if the text is readonly do not add the text - if (!IsEditable) + if (IsReadOnly) { e.Handled = true; return; } - int position = TextBox.SelectionStart; + int position = SelectionStart; MaskedTextProvider provider = MaskProvider; - if (position < TextBox.Text.Length) + + if (position < Text.Length) { position = GetNextCharacterPosition(position); @@ -241,16 +294,16 @@ namespace Microsoft.Windows.Controls void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { - if (!IsEditable) + if (IsReadOnly) return; MaskedTextProvider provider = MaskProvider; - int position = TextBox.SelectionStart; - int selectionlength = TextBox.SelectionLength; + int position = SelectionStart; + int selectionlength = SelectionLength; // If no selection use the start position else use end position int endposition = (selectionlength == 0) ? position : position + selectionlength - 1; - if (e.Key == Key.Delete && position < TextBox.Text.Length)//handle the delete key + if (e.Key == Key.Delete && position < Text.Length)//handle the delete key { if (provider.RemoveAt(position, endposition)) UpdateText(provider, position); @@ -313,8 +366,7 @@ namespace Microsoft.Windows.Controls Text = provider.ToDisplayString(); - if (TextBox != null) - TextBox.SelectionStart = position; + SelectionStart = position; } private int GetNextCharacterPosition(int startPosition) @@ -333,17 +385,15 @@ namespace Microsoft.Windows.Controls MaskProvider = new MaskedTextProvider(mask) { IncludePrompt = this.IncludePrompt, - IncludeLiterals = this.IncludeLiterals + IncludeLiterals = this.IncludeLiterals, + PromptChar = this.PromptChar }; } - private bool _convertExceptionOccurred = false; - private object ConvertTextToValue(string text) { - object convertedValue = null; - + Type dataType = ValueType; string valueToConvert = MaskProvider.ToString().Trim(); @@ -408,45 +458,30 @@ namespace Microsoft.Windows.Controls _isSyncingTextAndValueProperties = true; //this only occures when the user typed in the value - if (InputBase.TextProperty == p) + if (MaskedTextBox.TextProperty == p) { if (newValue != null) SetValue(MaskedTextBox.ValueProperty, ConvertTextToValue(newValue.ToString())); } - SetValue(InputBase.TextProperty, ConvertValueToText(newValue)); + SetValue(MaskedTextBox.TextProperty, ConvertValueToText(newValue)); _isSyncingTextAndValueProperties = false; } #endregion //Private - #region Public - - /// - /// Attempts to set focus to this element. - /// - public new void Focus() - { - if (TextBox != null) - TextBox.Focus(); - else - base.Focus(); - } - - #endregion //Public - #endregion //Methods #region Commands private void Paste(object sender, RoutedEventArgs e) { - if (!IsEditable) + if (IsReadOnly) return; MaskedTextProvider provider = MaskProvider; - int position = TextBox.SelectionStart; + int position = SelectionStart; object data = Clipboard.GetData(DataFormats.Text); if (data != null) diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml index febe9614..a26c3fdb 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml @@ -10,7 +10,7 @@ - + diff --git a/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Themes/Generic.xaml b/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Themes/Generic.xaml index 45bf4339..2ed658f3 100644 --- a/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution_35/Src/WPFToolkit.Extended/Themes/Generic.xaml @@ -12,7 +12,7 @@ - +