У меня есть 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}" />