WPF - смесь авто и пропорциональных размеров строк - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть сетка WPF с 3 строками, размер которых я бы хотел пропорционально, если только в одном или нескольких столбцах нет содержимого.Каждая строка в настоящее время имеет вид сетки, и если строк нет, я бы хотел, чтобы другие 2 столбца были одинакового размера.Если данные хранятся только в одной строке, я бы хотел, чтобы эта строка занимала все пространство.

Строки равной высоты:

Equal Height Rows

Равная высота только для 2Строки с данными

Equal Height for only 2 Rows with Data

Мое текущее определение сетки выглядит следующим образом:

<Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

Очевидно, что высота будет равномерно распределена по всем 3 столбцам.Мне интересно, как я могу динамически использовать Auto и * sizing для одного столбца, в зависимости от того, присутствуют данные или нет.

1 Ответ

0 голосов
/ 24 декабря 2018

Насколько я понимаю, Grid - это контейнер, что означает, что Grid визуализируется перед фактическим содержимым.Технически было бы невозможно установить динамическую высоту / ширину в соответствии с содержимым (если вы не установите auto).Обычно эту ситуацию можно преодолеть, контролируя ширину / высоту управления вместо решения сложного решения.Проще говоря, скажем, если у вас есть 3 элемента управления, и любой из 2 должен быть отображен, который должен в равной степени занимать ширину / высоту страницы, вы можете установить высоту строки сетки в автоматический режим, в то время как установить высоту содержимого.Для справки вы можете использовать ActualWidth родительского элемента управления.

Вот пример для справки.В этом примере я предполагаю, что у вас есть какой-то механизм, который управляет сеткой, сколько пользовательских элементов управления видно сейчас.поэтому передайте количество элементов в converterParameter.

 public class HeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int.TryParse(parameter.ToString(), out var items);
        double.TryParse(value.ToString(), out var actualheight);
        return actualheight / items;
    }
         //......    
  }

 <Window.Resources>
    <local:HeightConverter x:Key="HeightConverter"/>
</Window.Resources>
<Grid x:Name="mainGrid" Background="Gray">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>

    </Grid.RowDefinitions>
    <local:sampleControl Background="Red" Grid.Row="0" Height="{Binding ElementName=mainGrid, Path=ActualHeight, Converter={StaticResource HeightConverter}, ConverterParameter=3}"/>
    <local:sampleControl Background="Yellow" Grid.Row="1" Height="{Binding ElementName=mainGrid, Path=ActualHeight, Converter={StaticResource HeightConverter}, ConverterParameter=3}"/>

    <local:sampleControl Background="Blue" Grid.Row="2" Height="{Binding ElementName=mainGrid, Path=ActualHeight, Converter={StaticResource HeightConverter}, ConverterParameter=3}"/>

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