具有可见光标的WPF的只读文本框(.NET 3.5)

我需要我的文本框是只读的。 但是,当我将IsReadOnly设置为true时 ,由于光标不再出现,用户无法再使用键盘与文本框进行交互。

在.NET 4中有一个IsReadOnlyCaretVisible属性,但是,我被迫使用.NET 3.5。

有一个很好的解决方案吗?

谢谢!

在XAML中使用这两个

IsReadOnly="True" IsReadOnlyCaretVisible="True" 

IsReadOnlyCaretVisible仅在使用第一个属性时有效。

我结束了自己使用附加属性做它,它执行以下操作:

  • 使用键盘禁用对文本框的所有输入和修改
  • 将上下文菜单设置为仅复制
  • 禁用剪切/粘贴命令
  • 使用鼠标选择和拖动禁用修改
  • 更改文本框的bacgrkound颜色以通知它是只读的。

用法:

  This textbox has some long text and it can't be edited.  

class级:

 public static class ReadOnlyModeWithCursor { public static readonly DependencyProperty IsModeEnabledProperty = DependencyProperty.RegisterAttached("IsModeEnabled", typeof(bool), typeof(ReadOnlyModeWithCursor), new FrameworkPropertyMetadata(OnModeEnabledChanged)); private static ContextMenu _contextMenuWithCopyOnly = new ContextMenu(); static ReadOnlyModeWithCursor() { _contextMenuWithCopyOnly.Items.Add(new MenuItem { Command = ApplicationCommands.Copy }); } public static bool GetIsModeEnabled(TextBox textBox) { if (textBox == null) { throw new ArgumentNullException("textBox"); } return (bool)textBox.GetValue(IsModeEnabledProperty); } public static void SetIsModeEnabled(TextBox textBox, bool value) { if (textBox == null) { throw new ArgumentNullException("textBox"); } textBox.SetValue(IsModeEnabledProperty, value); } private static void NoCutting(object sender, ExecutedRoutedEventArgs e) { if (e.Command == ApplicationCommands.Cut) { e.Handled = true; } } private static void NoDragCopy(object sender, DataObjectCopyingEventArgs e) { if (e.IsDragDrop) { e.CancelCommand(); } } private static void OnModeEnabledChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { var textBox = (TextBox)dependencyObject; var isEnabled = (bool)e.NewValue; if (isEnabled) { textBox.PreviewTextInput += textBox_PreviewTextInput; textBox.PreviewKeyDown += textBox_PreviewKeyDown; DataObject.AddPastingHandler(textBox, Pasting); DataObject.AddCopyingHandler(textBox, NoDragCopy); CommandManager.AddPreviewExecutedHandler(textBox, NoCutting); // Default context menu has cut & paste, we want only copy. textBox.ContextMenu = _contextMenuWithCopyOnly; // Remove if you want to set the style of readonly textboxes via styles textBox.Background = new SolidColorBrush(Color.FromRgb(240, 240, 240)); } else { textBox.PreviewTextInput -= textBox_PreviewTextInput; textBox.PreviewKeyDown -= textBox_PreviewKeyDown; DataObject.RemovePastingHandler(textBox, Pasting); DataObject.RemoveCopyingHandler(textBox, NoDragCopy); CommandManager.RemovePreviewExecutedHandler(textBox, NoCutting); textBox.ClearValue(TextBox.ContextMenuProperty); textBox.ClearValue(TextBox.BackgroundProperty); } } private static void Pasting(object sender, DataObjectPastingEventArgs e) { e.CancelCommand(); } private static void textBox_PreviewKeyDown(object sender, KeyEventArgs e) { //pressing space doesn't raise PreviewTextInput, reasons here http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b?prof=required if (e.Key == Key.Space || e.Key == Key.Back || e.Key == Key.Delete) { e.Handled = true; } } private static void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = true; } } 

您可以尝试从.NET 4.0中提取模板 ,并在.NET 3.5应用程序中使用它们。

希望您可以使用它而无需太多调整。