How can I prioritize WPF textbox wrap over autosize?
Although I wouldn't recommend doing this as I think it introduces unexpected behavior to the user, this seems to achieve what you're asking:
XAML:
<TextBox ... MinHeight="120" Width="200" SizeChanged="TextBox_SizeChanged" />
Code behind:
private void TextBox_SizeChanged(object sender, SizeChangedEventArgs e)
{
try
{
if (e.PreviousSize == Size.Parse("0,0")) return;
if (e.PreviousSize == e.NewSize) return;
if (e.HeightChanged)
{
((TextBox)sender).Width = e.PreviousSize.Width + 20;
}
}
finally
{
e.Handled = true;
}
}
A couple of things to note, 1) in order for this to work you must both a MinHeight
and Width
to allow for expansion and 2) the horizontal expansion of 20 is just an arbitrary value I used for testing purposes; you'll want to come up with a more reliable way of calculating a variable expansion value.
There's a simple trick to get it working. Use a Canvas and then bind the width of the textbox to the actualwidth of the canvas and the height of the canvas to the actualheight of the textbox.
<Canvas
x:Name="Canvas"
Height="{Binding ElementName=TextBlock, Path=ActualHeight}"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<TextBlock
x:Name="TextBlock"
Width="{Binding ElementName=Canvas, Path=ActualWidth}"
TextWrapping="WrapWithOverflow"
Text="blah blah blah blah" />
</Canvas>
Screen shots of our production app using it
and resized
The trick is that the Canvas inherits the width from the parent container and the height from it's child. I'm considering wrapping the pattern in a custom control.