Как заставить детей StackPanel заполнять максимальное пространство вниз?

Просто используйте join(), как в примерах, но преобразуйте все числа в str.

numList = [1, 2, 3]

print('Numbers entered: %s' % ' '.join(map(str, numList)))
#Numbers entered: 1 2 3
338
задан Mr. Annoyed 25 September 2017 в 06:49
поделиться

3 ответа

Это кажется, что Вы хотите StackPanel, где заключительный элемент израсходовал все остающееся пространство. Но почему бы не использовать DockPanel? Украсьте другие элементы в DockPanel с DockPanel.Dock="Top", и затем Ваше управление справкой может заполнить остающееся пространство.

XAML:

<DockPanel Width="200" Height="200" Background="PowderBlue">
    <TextBlock DockPanel.Dock="Top">Something</TextBlock>
    <TextBlock DockPanel.Dock="Top">Something else</TextBlock>
    <DockPanel
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        Height="Auto" 
        Margin="10">

      <GroupBox 
        DockPanel.Dock="Right" 
        Header="Help" 
        Width="100" 
        Background="Beige" 
        VerticalAlignment="Stretch" 
        VerticalContentAlignment="Stretch" 
        Height="Auto">
        <TextBlock Text="This is the help that is available on the news screen." 
                   TextWrapping="Wrap" />
     </GroupBox>

      <StackPanel DockPanel.Dock="Left" Margin="10" 
           Width="Auto" HorizontalAlignment="Stretch">
          <TextBlock Text="Here is the news that should wrap around." 
                     TextWrapping="Wrap"/>
      </StackPanel>
    </DockPanel>
</DockPanel>

, Если Вы находитесь на платформе без DockPanel доступны (например, WindowsStore), можно создать тот же эффект с сеткой. Вот вышеупомянутый пример, выполненный с помощью сеток вместо этого:

<Grid Width="200" Height="200" Background="PowderBlue">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0">
        <TextBlock>Something</TextBlock>
        <TextBlock>Something else</TextBlock>
    </StackPanel>
    <Grid Height="Auto" Grid.Row="1" Margin="10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>
        <GroupBox
            Width="100"
            Height="Auto"
            Grid.Column="1"
            Background="Beige"
            Header="Help">
            <TextBlock Text="This is the help that is available on the news screen." 
              TextWrapping="Wrap"/>
        </GroupBox>
        <StackPanel Width="Auto" Margin="10" DockPanel.Dock="Left">
            <TextBlock Text="Here is the news that should wrap around." 
              TextWrapping="Wrap"/>
        </StackPanel>
    </Grid>
</Grid>
325
ответ дан Mark Heath 23 November 2019 в 00:39
поделиться

Причина, что это происходит, состоит в том, потому что панель стека измеряет каждый дочерний элемент с положительной бесконечностью как ограничение для оси, что это складывает элементы вперед. Дочерние элементы управления должны возвратиться, как большой они хотят быть (положительная бесконечность не является допустимым возвратом из MeasureOverride ни в одной оси), таким образом, они возвращают самый маленький размер, где все будет соответствовать. У них нет способа знать, сколько пространства они действительно должны заполниться.

, Если Ваше представление doesn’t должно иметь функцию прокрутки и ответ выше, не удовлетворяет Вашим потребностям, я предложил бы, реализуют Вашу собственную панель. Можно, вероятно, произойти прямо из StackPanel и затем всего, что необходимо будет сделать, измениться метод ArrangeOverride так, чтобы он разделил остающееся пространство между его дочерними элементами (предоставление их каждый то же количество дополнительного пространства). Элементы должны представить прекрасный, если им дадут больше пространства, чем они хотели, но если Вы дадите им меньше, то Вы начнете видеть незначительные сбои.

, Если Вы хотите смочь прокрутить все это затем, я - испуганные вещи, будет вполне немного более трудным, потому что ScrollViewer дает Вам бесконечную сумму пространства для работы, с которым поместит Вас в то же положение, как дочерние элементы были первоначально. В этой ситуации Вы могли бы хотеть создать новое свойство на своей новой панели, которая позволяет Вам указать размер области просмотра, необходимо смочь связать это с размером ScrollViewer’s. Идеально Вы реализовали бы IScrollInfo, но это начинает быть сложным, если Вы собираетесь реализовать все это правильно.

104
ответ дан Caleb Vear 23 November 2019 в 00:39
поделиться

Альтернативный метод должен использовать Сетку с одним столбцом и n строки. Установите все высоты строк на Auto и самую нижнюю высоту строки к 1*.

я предпочитаю этот метод, потому что я нашел, что Сетки имеют лучшее выполнение расположения, чем DockPanels, StackPanels и WrapPanels. Но если Вы не используете их в ItemTemplate (где расположение выполняется для большого количества объектов), Вы никогда не будете, вероятно, замечать.

57
ответ дан rcabr 23 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: