2013-08-20 1 views
4

Когда пользователь нажимает клавишу Insert в текстовом поле WPF, элемент управления переключает режим вставки и перезаписывания. Обычно это визуализируется с использованием другого курсора (строка против блока), но здесь это не так. Поскольку пользователю абсолютно не известно, что режим перезаписывания активен, я просто хотел бы полностью отключить его. Когда пользователь нажимает клавишу Insert (или, однако, этот режим может быть активирован, преднамеренно или случайно), TextBox должен просто оставаться в режиме вставки.Отключить режим перезаписи в текстовом поле WPF (при нажатии клавиши Insert)

Я мог бы добавить некоторый обработчик события нажатия клавиши и игнорировать все такие события, нажав клавишу Insert без модификаторов. Этого будет достаточно? Вы знаете лучшую альтернативу? В моих представлениях есть несколько элементов управления TextBox, и я не хочу добавлять обработчики событий везде ...

ответ

6

Вы могли бы сделать AttachedProperty и использовать метод ChrisF предложенный, таким образом, его Eay добавить к TextBoxes вы хотите хотя из приложения

Xaml:

<TextBox Name="textbox1" local:Extensions.DisableInsert="True" /> 

AttachedProperty:

public static class Extensions 
{ 
    public static bool GetDisableInsert(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(DisableInsertProperty); 
    } 

    public static void SetDisableInsert(DependencyObject obj, bool value) 
    { 
     obj.SetValue(DisableInsertProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DisableInsertProperty = 
     DependencyProperty.RegisterAttached("DisableInsert", typeof(bool), typeof(Extensions), new PropertyMetadata(false, OnDisableInsertChanged)); 

    private static void OnDisableInsertChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (d is TextBox && e != null) 
     { 
      if ((bool)e.NewValue) 
      { 
       (d as TextBox).PreviewKeyDown += TextBox_PreviewKeyDown; 
      } 
      else 
      { 
       (d as TextBox).PreviewKeyDown -= TextBox_PreviewKeyDown; 
      } 
     } 
    } 

    static void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Insert && e.KeyboardDevice.Modifiers == ModifierKeys.None) 
     { 
      e.Handled = true; 
     } 
    } 
+0

Спасибо, t его работы очень хорошо. Может быть, я могу добавить прикрепленное свойство к каждому TextBox в своем приложении автоматически через стиль? – ygoe

+0

Проверка 'e! = Null' не требуется. –

3

Чтобы избежать добавления обработчиков повсюду, вы можете подклассифицировать TextBox и добавить обработчик событий PreviewKeyDown, который делает то, что вы предлагаете.

В конструкторе:

public MyTextBox() 
{ 
    this.KeyDown += PreviewKeyDownHandler; 
} 


private void PreviewKeyDownHandler(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Insert) 
    { 
     e.Handled = true; 
    } 
} 

Однако это не означает, что вам нужно будет заменить все обычаи TextBox с MyTextBox в вашем XAML, поэтому, к сожалению вы будете иметь, чтобы изменить все ваши мнения в любом случае.

Смежные вопросы