2011-09-28 13 views
12

के साथ WPF के लिए केवल पाठ बॉक्स को पढ़ने के लिए मुझे अपने टेक्स्टबॉक्स की आवश्यकता है। हालांकि, जब मैंने IsReadOnly से सत्य सेट किया है, तो उपयोगकर्ता अब कर्सर का उपयोग करके टेक्स्टबॉक्स से इंटरैक्ट नहीं कर सकता क्योंकि कर्सर अब प्रकट नहीं होता है।दृश्य कर्सर (.NET 3.5)

.NET 4 में IsReadOnlyCaretVisible संपत्ति है, हालांकि, मुझे .NET 3.5 का उपयोग करने के लिए मजबूर होना पड़ता है।

क्या कोई अच्छा समाधान है?

धन्यवाद!

उत्तर

3

मैं समाप्त कर दिया है कि यह इसे अपने आप को एक संलग्न संपत्ति का उपयोग कर कर रही है, यह करता है निम्नलिखित:

  • कुंजीपटल
  • संदर्भ मेनू का उपयोग कर सेट की प्रतिलिपि केवल
  • के लिए पाठ बॉक्स के लिए सभी इनपुट और संशोधन अक्षम करता है
  • अक्षम काट/चिपका आदेश
  • अक्षम माउस चयन & खींच
  • परिवर्तन पाठ बॉक्स के bacgrkound रंग ख यह सूचित करने के लिए का उपयोग कर संशोधन केवल पढ़ने के लिए।

उपयोग:

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

वर्ग:

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

IsReadOnly="True" 
IsReadOnlyCaretVisible="True" 

IsReadOnlyCaretVisible ही काम करता है जब पहली संपत्ति किया जा रहा है अपने XAML में इन दोनों के उपयोग।

+2

यह केवल .NET 4 के लिए अच्छा है ... – VitalyB