2015-08-13 2 views
0

У меня есть EditableTextBlock, который реализует редактирование встроенного подхода. В настоящее время, когда EditName = true, он выбирает все содержащее Text из TextBox и начинает режим редактирования. Проблема в том, что если я ударил , введите, он сохранит пустое имя для моего элемента.Как предотвратить последовательность «/ r/n», когда клавиша Enter нажата в текстовом поле - wpf

После отладки кода, я заметил, что когда я нажимаю войти, эта команда переводится на "/r/n" строку, заменяя выделенный текст. И тогда мой код строки ниже просто превратить его в пустую строку:

_textBox.Text.Replace("\r\n", string.Empty); 

То, что я хотел бы это предотвратить Введите ключ от прохождения этого значения и стереть все мои выделенный текст. Невыделение текста в первую очередь не решило бы мою проблему, так как это желаемая функциональность. Возможно ли это? Заранее спасибо!

Ниже приведены некоторые код, который может помочь вам, ребята, понять мои обстоятельства:

EditableTextBlock.cs

public class EditableTextBlock : TextBlock 
    { 
     public bool IsInEditMode 
     { 
      get 
      { 
       return (bool)GetValue(IsInEditModeProperty); 
      } 
      set 
      { 
       SetValue(IsInEditModeProperty, value); 
      } 
     } 

     private EditableTextBlockAdorner _adorner; 

     // Using a DependencyProperty as the backing store for IsInEditMode. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty IsInEditModeProperty = 
      DependencyProperty.Register("IsInEditMode", typeof(bool), typeof(EditableTextBlock), new UIPropertyMetadata(false, IsInEditModeUpdate)); 

     /// <summary> 
     /// Determines whether [is in edit mode update] [the specified obj]. 
     /// </summary> 
     /// <param name="obj">The obj.</param> 
     /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param> 
     private static void IsInEditModeUpdate(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
     { 
      EditableTextBlock textBlock = obj as EditableTextBlock; 
      if (null != textBlock) 
      { 
       //Get the adorner layer of the uielement (here TextBlock) 
       AdornerLayer layer = AdornerLayer.GetAdornerLayer(textBlock); 

       //If the IsInEditMode set to true means the user has enabled the edit mode then 
       //add the adorner to the adorner layer of the TextBlock. 
       if (textBlock.IsInEditMode) 
       { 
        if (null == textBlock._adorner) 
        { 
         textBlock._adorner = new EditableTextBlockAdorner(textBlock); 

         //Events wired to exit edit mode when the user presses Enter key or leaves the control. 
         textBlock._adorner.TextBoxKeyUp += textBlock.TextBoxKeyUp; 
         textBlock._adorner.TextBoxLostFocus += textBlock.TextBoxLostFocus; 
        } 
        layer.Add(textBlock._adorner); 
       } 
       else 
       { 
        if (layer != null) 
        { 
         //Remove the adorner from the adorner layer. 
         Adorner[] adorners = layer.GetAdorners(textBlock); 
         if (adorners != null) 
         { 
          foreach (Adorner adorner in adorners) 
          { 
           if (adorner is EditableTextBlockAdorner) 
           { 
            layer.Remove(adorner); 
           } 
          } 
         } 
        } 

        //Update the textblock's text binding. 
        BindingExpression expression = textBlock.GetBindingExpression(TextProperty); 
        if (null != expression) 
        { 
         expression.UpdateTarget(); 
        } 
       } 
      } 
     } 

     /// <summary> 
     /// Gets or sets the length of the max. 
     /// </summary> 
     /// <value>The length of the max.</value> 
     public int MaxLength 
     { 
      get 
      { 
       return (int)GetValue(MaxLengthProperty); 
      } 
      set 
      { 
       SetValue(MaxLengthProperty, value); 
      } 
     } 

     // Using a DependencyProperty as the backing store for MaxLength. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty MaxLengthProperty = 
      DependencyProperty.Register("MaxLength", typeof(int), typeof(EditableTextBlock), new UIPropertyMetadata(0)); 

     private void TextBoxLostFocus(object sender, RoutedEventArgs e) 
     { 
      IsInEditMode = false; 
     } 

     /// <summary> 
     /// release the edit mode when user presses enter. 
     /// </summary> 
     /// <param name="sender">The sender.</param> 
     /// <param name="e">The <see cref="System.Windows.Input.KeyEventArgs"/> instance containing the event data.</param> 
     private void TextBoxKeyUp(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.Enter) 
      { 
       IsInEditMode = false; 
      } 

      TextBox tb = sender as TextBox; 
      if (tb.Text.EndsWith("..") && e.Key == Key.OemPeriod) 
      { 
       tb.Text = tb.Text.Replace("..", "."); 
       tb.CaretIndex = tb.Text.Length; 
      } 
     } 

     /// <summary> 
     /// Invoked when an unhandled <see cref="E:System.Windows.Input.Mouse.MouseDown"/> attached event reaches an element in its route that is derived from this class. Implement this method to add class handling for this event. 
     /// </summary> 
     /// <param name="e">The <see cref="T:System.Windows.Input.MouseButtonEventArgs"/> that contains the event data. This event data reports details about the mouse button that was pressed and the handled state.</param> 
     protected override void OnMouseDown(MouseButtonEventArgs e) 
     { 
      /*if (e.MiddleButton == MouseButtonState.Pressed) 
      { 
       IsInEditMode = true; 
      } 
      else if (e.ClickCount == 2) 
      { 
       IsInEditMode = true; 
      }*/ 
     } 
    } 
} 

EditableTextBlockAdorner.cs

/// <summary> 
    /// Adorner class which shows textbox over the text block when the Edit mode is on. 
    /// </summary> 
    public class EditableTextBlockAdorner : Adorner 
    { 
     private readonly VisualCollection _collection; 

     private readonly TextBox _textBox; 

     private readonly TextBlock _textBlock; 

     public EditableTextBlockAdorner(EditableTextBlock adornedElement) 
      : base(adornedElement) 
     { 
      _collection = new VisualCollection(this); 
      _textBox = new TextBox(); 
      _textBlock = adornedElement; 
      Binding binding = new Binding("Text") {Source = adornedElement}; 
      _textBox.SetBinding(TextBox.TextProperty, binding); 
      _textBox.SelectAll(); 
      _textBox.AcceptsReturn = true; 
      _textBox.MaxLength = adornedElement.MaxLength; 
      _textBox.KeyUp += _textBox_KeyUp; 
      _collection.Add(_textBox); 
     } 

     void _textBox_KeyUp(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.Enter) 
      { 
       _textBox.Text = _textBox.Text.Replace("\r\n", string.Empty); 
       BindingExpression expression = _textBox.GetBindingExpression(TextBox.TextProperty); 
       if (null != expression) 
       { 
        expression.UpdateSource(); 
       } 
      } 
     } 

     protected override Visual GetVisualChild(int index) 
     { 
      return _collection[index]; 
     } 

     protected override int VisualChildrenCount 
     { 
      get 
      { 
       return _collection.Count; 
      } 
     } 

     protected override Size ArrangeOverride(Size finalSize) 
     { 
      _textBox.Arrange(new Rect(0, 0, _textBlock.DesiredSize.Width + 50, _textBlock.DesiredSize.Height * 1.5)); 
      _textBox.Focus(); 
      return finalSize; 
     } 

     protected override void OnRender(DrawingContext drawingContext) 
     { 
      drawingContext.DrawRectangle(null, new Pen 
                { 
       Brush = Brushes.Gold, 
       Thickness = 2 
      }, new Rect(0, 0, _textBlock.DesiredSize.Width + 50, _textBlock.DesiredSize.Height * 1.5)); 
     } 

     public event RoutedEventHandler TextBoxLostFocus 
     { 
      add 
      { 
       _textBox.LostFocus += value; 
      } 
      remove 
      { 
       _textBox.LostFocus -= value; 
      } 
     } 

     public event KeyEventHandler TextBoxKeyUp 
     { 
      add 
      { 
       _textBox.KeyUp += value; 
      } 
      remove 
      { 
       _textBox.KeyUp -= value; 
      } 
     } 
    } 
} 

использование XAML:

<ctrl:EditableTextBlock Margin="6,0,0,0" Text="{Binding Path=Name, Mode=TwoWay}" IsInEditMode="{Binding EditName, Mode=TwoWay}" /> 

ответ

1

Простой и легкий, как я пропускал это?!

_textBox.AcceptsReturn = false; 
Смежные вопросы