Как автоматически ограничить минимальный размер строк / столбцов при использовании пропорционального размера сетки (*)? - PullRequest
0 голосов
/ 04 июля 2018

Предполагая, что у нас есть простое окно:

<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.&#x0a;It has some text.&#x0a;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

Кажется, хорошо. Однако после изменения размера содержимое верхней кнопки обрезается: Small size

Нужный макет должен выглядеть следующим образом:

Desired behaviour

В тексте: заставить высоту строки вести себя пропорционально (*) с MinHeight равным Auto высоте. Другими словами, Height должно быть Max(1*,Auto).

Я предполагаю, что если WPF способен автоматически определять размер строки при значении Auto, то должен быть способ заставить его соблюдать этот размер при пропорциональном определении размера.

Я нашел несколько связанных вопросов ( 1 , 2 ), но не смог адаптировать используемые там методы к моему делу.

Единственный результат, достигнутый на данный момент, это

  • Привязать Button.MinHeight к вложенному TextBlock.ActualHeight
  • В коде: перечислите все дочерние элементы сетки, расположенные в первой строке, найдите максимальное значение MinHeight, установите его как RowDefinition.MinHeight. Выглядит дрянно, потому что кнопка больше текстового блока.

Может быть что-то связанное с Measure & Arrange нужно? Или это не стоит усилий, и было бы лучше просто поместить MinHeight вручную (а также иметь некоторые проблемы с различиями длины строк локализации)?

1 Ответ

0 голосов
/ 04 июля 2018

Вот быстрый и легкий трюк.

Дублируйте элемент управления (и скройте его) и используйте его измерения, чтобы найти MinHeight:

<Grid>
    <Grid x:Name="dummyControl" VerticalAlignment="Center">
        <Button Grid.Row="0" Margin="2,2,2,2" Visibility="Hidden" IsHitTestVisible="False">
            <TextBlock
                Text="Button 1.&#x0a;It has some text.&#x0a;Button shouldn't shrink less then the text size."
                TextWrapping="WrapWithOverflow" />
        </Button>
    </Grid>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="{Binding ElementName=dummyControl, Path=ActualHeight}" Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Button Grid.Row="0" Margin="2,2,2,2">
            <TextBlock
                Text="Button 1.&#x0a;It has some text.&#x0a;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>
</Grid>

VerticalAlignment из dummyControl должно быть чем-то отличным от Stretch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...