2011-09-28 4 views
12

텍스트 상자가 읽기 전용이어야합니다. 그러나 IsReadOnly을 으로 설정하면 커서가 더 이상 나타나지 않으므로 키보드를 사용하여 더 이상 텍스트 상자와 상호 작용할 수 없습니다.보이는 커서가있는 WPF 용 읽기 전용 텍스트 상자 (.NET 3.5)

.NET 4에는 IsReadOnlyCaretVisible 속성이 있지만 .NET 3.5를 사용해야합니다.

좋은 해결책이 있습니까?

감사합니다.

답변

3

나는 그것을하지, 그것은 연결된 속성을 사용하여 나 자신을 일을 종료 한 다음

  • 복사가 키보드
  • 에게 상황에 맞는 메뉴를 설정하여 텍스트 상자에 모든 입력 및 수정을 사용하지 않습니다
  • 비활성화 잘라 내기/붙여 넣기는
  • 의 b를 알리기 위해 텍스트 상자의 bacgrkound의 색상을 변경 드래그 마우스 선택 &를 사용
  • 불가능하게 수정 명령 읽기 전용.

사용법 :

<TextBox AttachedProperties:ReadOnlyModeWithCursor.IsModeEnabled="True"> 
    This textbox has some long text and it can't be edited. 
</TextBox> 

클래스 : 첫 번째 속성이 사용되는 경우 IsReadOnlyCaretVisible

IsReadOnly="True" 
IsReadOnlyCaretVisible="True" 

에만 작동하여 XAML에서

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; 
    } 
} 
+0

솔루션을 주셔서 감사합니다. 상황에 맞는 메뉴를 제외하고 모든 것이 잘 작동합니다. 전체 메뉴 (잘라 내기, 복사, 붙여 넣기)가 계속 표시됩니다.이 이유가 무엇일까요? – klawusel

1

extracting the templates from .NET 4.0을 시도해보고 .NET 3.5 응용 프로그램에서 사용할 수 있습니다.

너무 많이 조정하지 않고 사용할 수 있기를 바랍니다.

10

사용이 모두.

+2

.NET 4에 적합합니다 ... – VitalyB

관련 문제