2013-08-20 57 views
4

當用戶在WPF文本框中按下插入鍵時,控件在插入和覆蓋模式之間切換。通常,這是通過使用不同的遊標(行與塊)來可視化的,但這不是這種情況。由於用戶絕對沒有辦法知道覆蓋模式處於活動狀態,所以我只想完全禁用它。當用戶按下插入鍵(或者可能有意或無意地激活該模式)時,文本框應該簡單地保持插入模式。禁用WPF文本框中的覆蓋模式(當按下插入鍵時)

我可以添加一些按鍵事件處理程序,並忽略所有這些事件,按Insert鍵沒有修飾符。這足夠嗎?你知道更好的選擇嗎?還有在我的觀點了一些TextBox控件的,我不希望添加事件處理程序無處不在......

回答

6

你可以做一個AttachedProperty和使用方法ChrisF建議,這樣一來它的EAY添加到您想要thoughout應用程序

XAML中TextBoxes

<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他的作品非常好。也許我可以通過樣式自動添加附加屬性到我的應用程序中的每個文本框? – 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; 
    } 
} 

但是,這並不意味着你需要在你的XAML MyTextBox更換的TextBox所有用途,所以很遺憾,你將不得不反正編輯所有的意見。

相關問題