DockPanel - элемент управления Stretch, чтобы заполнить оставшееся пространство относительно его братьев и сестер. Видимость - PullRequest
0 голосов
/ 11 мая 2019

Следующий фрагмент дает такой результат:

<DockPanel Width="240">
    <ComboBox HorizontalAlignment="Stretch">
        <ComboBoxItem Content="A" />
        <ComboBoxItem Content="B" />
        <ComboBoxItem Content="C" />
    </ComboBox>
</DockPanel>

enter image description here

Как мы видим, ComboBox заполняет всю DockPanel ширинухорошо, как и должно быть.Если мы добавим следующее StackPanel сразу после ComboBox, мы получим следующее:

<StackPanel Orientation="Horizontal" Width="120" Visibility="Visible" Background="Aqua">
    <TextBox Width="60" />
    <TextBox Width="60" />
</StackPanel>

enter image description here

Мы только что получилиПервая проблема: не должен ли ComboBox заполнить другие 120 пикселей DockPanel, потому что это HorizontalAlignment=Stretch, а поскольку StackPanel использует другие 120?

Наименее, если мы повернемнаши StackPanel.Visibility в Hidden/Collapsed, у нас будет это:

enter image description here

Как я могу сделать ComboBox для заполнения всего DockPanel.Width ГОРИЗОНТАЛЬНО , как и первое изображение, когда StackPanel.Visibility равно Hidden/Collapsed?

Все элементы управления должны быть выровнены по горизонтали, и DockPanel не является обязательным для достижения этого.

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Мы только что столкнулись с первой проблемой: не должен ли ComboBox заполнить другие 120 пикселей DockPanel, потому что это HorizontalAlignment=Stretch, а поскольку StackPanel использует другие 120?

Только если это последний потомок DockPanel:

<DockPanel Width="240">
    <StackPanel Orientation="Horizontal" Width="120" Visibility="Visible" Background="Aqua"
                DockPanel.Dock="Right">
        <TextBox Width="60" />
        <TextBox Width="60" />
    </StackPanel>
    <ComboBox>
        <ComboBoxItem Content="A" />
        <ComboBoxItem Content="B" />
        <ComboBoxItem Content="C" />
    </ComboBox>
</DockPanel>

Нет смысла явно устанавливать для свойства HorizontalAlignment значение Stretch. Это значение по умолчанию.

Как сделать ComboBox для заполнения всего DockPanel.Width ГОРИЗОНТАЛЬНО, как и первое изображение, когда StackPanel.Visibility равно Hidden / Collapsed?

Путем добавления ComboBox в качестве последнего дочернего элемента в соответствии с приведенной выше разметкой.

0 голосов
/ 11 мая 2019

Если я вас понимаю, в вашем случае кажется, что компонент Grid будет хорошим выбором.

Для космического вопроса - Visibility = "Hidden" сохраняет оригинальное пространство компонентов "живым", затем, если это возможно, используйте Visibility = "Collapsed" вместо

 <Grid Width="240">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <ComboBox HorizontalAlignment="Stretch">
            <ComboBoxItem Content="A" />
            <ComboBoxItem Content="B" />
            <ComboBoxItem Content="C" />
        </ComboBox>
        <StackPanel  Grid.Column="1" Orientation="Horizontal"  Visibility="Visible" Background="Red">
            <TextBox Width="60" />
            <TextBox Width="60" />
        </StackPanel>
    </Grid>
...