Таблицы были разработаны для табличного содержания, не для расположения.
Так, никогда не плохо себя чувствуйте при использовании их для отображения данных.
Попробуйте следующее: визуализируйте свои текстовые элементы, как если бы вы это делали в любое другое время:
TextBlock
s, содержащийся в 'ItemsControl'? ListBox
? Поместите весь shebang в ViewBox
и установите его масштаб, соответствующий твои нужды. Ищите свойства горизонтального, вертикального или комбинированного масштабирования.
Это может помочь обходной путь:
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30*" MinHeight="30"/>
<RowDefinition Height="30*" MinHeight="30"/>
<RowDefinition Height="30*" MinHeight="30"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" MaxHeight="100">
<Viewbox>
<TextBlock Width="{Binding ElementName=tbLonger,Path=ActualWidth}">T</TextBlock>
</Viewbox>
</Button>
<Button Grid.Row="1" MaxHeight="100">
<Viewbox>
<TextBlock Width="{Binding ElementName=tbLonger,Path=ActualWidth}">Test</TextBlock>
</Viewbox>
</Button>
<Button Grid.Row="2" MaxHeight="100">
<Viewbox>
<TextBlock Name="tbLonger">Test Longer String</TextBlock>
</Viewbox>
</Button>
</Grid>
</ScrollViewer>
Ключ в том, чтобы установить для всех текстовых блоков одинаковую ширину. В этом случае все они следуют самому длинному текстовому блоку через привязку.
Самый простой способ, вероятно, состоит в создании декоратора для выполнения этой работы. Вы можете назвать его "VerticalStretchDecorator" или что-то в этом роде.
Вот как он будет использоваться:
<UniformGrid Rows="3" MaxHeight="300">
<Button>
<my:VerticalStretchDecorator>
<TextBlock>T</TextBlock>
</my:VerticalStretchDecorator>
</Button>
<Button>
<my:VerticalStretchDecorator>
<TextBlock>Test</TextBlock>
</my:VerticalStretchDecorator>
</Button>
<Button>
<my:VerticalStretchDecorator>
<TextBlock>Test Longer String</TextBlock>
</my:VerticalStretchDecorator>
</Button>
</UniformGrid>
Я использовал UniformGrid
вместо Grid
, но он будет работать так же, как и Grid
.
Это было бы реализовано примерно так:
public class VerticalStretchDecorator : Decorator
{
protected override Size MeasureOverride(Size constraint)
{
var desired = base.Measure(constraint);
if(desired.Height > constraint.Height || desired.Height==0)
LayoutTransform = null;
else
{
var scale = constraint.Height / desired.Height;
LayoutTransform = new ScaleTransform(scale, scale); // Stretch in both directions
}
}
}