Предполагая, что у нас есть простое окно:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Width="300" Height="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button Grid.Row="0" Margin="2,2,2,2">
<TextBlock
Text="Button 1.
It has some text.
Button shouldn't shrink less then the text size."
TextWrapping="WrapWithOverflow" />
</Button>
<Button Grid.Row="1" Content="Button 2" Margin="2,2,2,2" />
</Grid>
</Window>
![Normal size](https://i.stack.imgur.com/Ny36q.png)
Кажется, хорошо. Однако после изменения размера содержимое верхней кнопки обрезается:
![Small size](https://i.stack.imgur.com/k08d3.png)
Нужный макет должен выглядеть следующим образом:
![Desired behaviour](https://i.stack.imgur.com/iBpWE.png)
В тексте: заставить высоту строки вести себя пропорционально (*) с MinHeight
равным Auto
высоте. Другими словами, Height
должно быть Max(1*,Auto)
.
Я предполагаю, что если WPF способен автоматически определять размер строки при значении Auto
, то должен быть способ заставить его соблюдать этот размер при пропорциональном определении размера.
Я нашел несколько связанных вопросов ( 1 , 2 ), но не смог адаптировать используемые там методы к моему делу.
Единственный результат, достигнутый на данный момент, это
- Привязать
Button.MinHeight
к вложенному TextBlock.ActualHeight
- В коде: перечислите все дочерние элементы сетки, расположенные в первой строке, найдите максимальное значение
MinHeight
, установите его как RowDefinition.MinHeight
. Выглядит дрянно, потому что кнопка больше текстового блока.
Может быть что-то связанное с Measure & Arrange
нужно? Или это не стоит усилий, и было бы лучше просто поместить MinHeight
вручную (а также иметь некоторые проблемы с различиями длины строк локализации)?