Ответ 1
Проблема заключается в том, что родительские элементы предоставляют TextBox столько пространства, сколько ему кажется, и когда будет присутствовать больше текста, он будет расширяться вместо того, чтобы оставаться в первоначальном автоматическом размере.
Одним из решений здесь является создание другого элемента с автоматическим размером и привязка TextBox.Width к нему:
<DockPanel>
<TreeView Width="150" DockPanel.Dock="Left"/>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/>
<Border x:Name="b" Grid.Column="1" Margin="5"/>
<TextBox Width="{Binding ActualWidth, ElementName=b}"
MinWidth="200"
Grid.Column="1"
Margin="5"
VerticalAlignment="Center"
Text="Some Name"/>
</Grid>
</ScrollViewer>
</DockPanel>
Обратите внимание, что мы устанавливаем свойство Margin элемента авторазмера (Border). Это важно, потому что, если он не установлен, будет существовать цикл:
- Ширина границы автоизображается до ширины столбца сетки
- Ширина TextBox изменяется на Border.ActualWidth
- Ширина столбца сетки изменяется до ширины TextBox + поля TextBox.
- Ширина границы автоматически изменяет ширину столбца сетки.
Установив Margin так же, как и TextBox, изменение размера TextBox не повлияет на размер сетки.