Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a keyboard scrollable readonly WPF TextBox?

Tags:

c#

wpf

It seems such a simple thing to do: use a TextBox to display some output and allow the user to cut and paste from it, scroll it but not edit it.

BUT: if a TextBox is readonly, then it loses most of its keyboard behaviour. You can click on it and select text using the invisible cursor, but it will not scroll or navigate.

I have this (terrible) solution.

<TextBox Focusable="True"
     VerticalScrollBarVisibility="Auto"
     HorizontalScrollBarVisibility="Auto"
     FontFamily="Consolas" FontSize="10pt"
     Foreground="{Binding Path=OutputTextColour}" 
     Text="{Binding Path=OutputText}"
     Background="White" PreviewKeyDown="TextBox_PreviewKeyDown" />

And a handler to throw away any attempts to edit:

   private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) {
  // the IsReadOnly flag on the control doesn't let the navigation keys work! WPF BUG?
  if (!(e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Left || e.Key == Key.Right 
     || e.Key == Key.Home || e.Key == Key.End || e.Key == Key.PageDown || e.Key == Key.PageUp 
     || e.Key == Key.Tab || e.Key == Key.Escape))
    e.Handled = true;
}

I have also tried a readonly TextBox inside a ScrollViewer, but it seems the TextBox, even when readonly, still swallows the navigation keystrokes and the ScrollView never sees them. If the ScrollViewer gets the focus then scrolling works and cut/copy/paste do not!

Yes, I could probably get all that to work by some fancy footwork with PreviewKeyDown, but really I just want a TextBox that plays nice!

like image 361
david.pfx Avatar asked Dec 19 '22 20:12

david.pfx


1 Answers

The answer is to set

IsReadOnlyCaretVisible="True"

as described here:

Readonly textbox for WPF with visible cursor (.NET 3.5)

Works beautifully!

like image 182
Jim Foye Avatar answered Dec 30 '22 00:12

Jim Foye