Выравнивание только видимых элементов в док-панели

<DockPanel Grid.Row="1" HorizontalAlignment="Right" Width="300">
    <Button x:Name="startPackageSendButton" Command="{Binding StartPackageSendingProcessCommand}"  Style="{StaticResource blueButtonStyle}" Content="Start" Width="100" VerticalAlignment="Top" Margin="0,0,0,0" Visibility="Visible" HorizontalAlignment="Right"/>
    <Button x:Name="clearPackageSendButton" Command="{Binding ClearPackageSendingProcessCommand}"  Style="{StaticResource blueButtonStyle}" Content="Clear" Width="100" VerticalAlignment="Top" Margin="0,0,0,0" Visibility="Collapsed" HorizontalAlignment="Right"/>
    <Button x:Name="cancelPackageSendButton" Command="{Binding CancelPackageSendingProcessCommand}" Style="{StaticResource blueButtonStyle}" Content="Stop" Width="100" VerticalAlignment="Top" Margin="0,0,0,0" Visibility="Visible" HorizontalAlignment="Right"/>
</DockPanel>

Я использую Dockpanel, чтобы складывать некоторые кнопки с горизонтальным выравниванием. Если некоторые кнопки не Visible, у меня есть пустые места между кнопками.

Как удалить пустые места, если Visibility для кнопок не отображается? Есть ли техника, с помощью которой я мог бы добиться такого эффекта?

РЕДАКТИРОВАТЬ: я изменил скрытый на свернутый, как было рекомендовано.


person no9    schedule 28.01.2014    source источник


Ответы (1)


Я подозреваю, что вы скрываете элементы управления, устанавливая Visibility.Hidden.

Вы должны использовать Visibility.Collapsed.

Подробнее читайте здесь:

Разница в том, что Visibility.Hidden скрывает элемент управления, но резервирует место, которое он занимает в макете. Таким образом, вместо элемента управления он отображает пробелы.

Visibilty.Collapsed не отображает элемент управления и не резервирует пробелы. Пространство, которое займет элемент управления, будет «свернуто», отсюда и название.

После редактирования становится очевидно, что вы используете Hidden. Вместо этого используйте Collapsed:

<DockPanel Grid.Row="1" HorizontalAlignment="Right" Width="300">
    <Button Visibility="Collapsed"/>
    <Button Visibility="Visible"/>
    <Button Visibility="Collapsed"/>
</DockPanel>

ИЗМЕНИТЬ:

Я проверил образец кода после удаления части стиля и команды и обнаружил несколько проблем:

  1. Удалите жестко заданную ширину из DockPanel (размер автоматически выбирается из дочерних элементов управления).
  2. Удалите HorizontalAlignment="Right" из DockPanel.
  3. Установите LastChildFill в False, если вы не хотите, чтобы последний добавленный дочерний элемент занимал все пространство.

Вот как это должно выглядеть и отлично работает:

<DockPanel Grid.Row="1" LastChildFill="False">
   <Button x:Name="startPackageSendButton" Content="Start" Width="100" 
           VerticalAlignment="Top" Margin="0,0,0,0" Visibility="Collapsed" 
           HorizontalAlignment="Right"/>
   <Button x:Name="clearPackageSendButton" Content="Clear" Width="100" 
           VerticalAlignment="Top" Margin="0,0,0,0" Visibility="Visible" 
           HorizontalAlignment="Right"/>
   <Button x:Name="cancelPackageSendButton" Content="Stop" Width="100" 
           VerticalAlignment="Top" Margin="0,0,0,0" Visibility="Collapsed" 
           HorizontalAlignment="Right"/>
 </DockPanel>
person Rohit Vats    schedule 28.01.2014
comment
ваш ответ действителен. Я установил Visibility.Collapsed как видимость по умолчанию в XAML, и я управляю видимостью в коде позади. Я заменил все на свернутый, а не на скрытый, но эффект все еще есть ... - person no9; 28.01.2014
comment
Выложите, пожалуйста, снимок того же. Также попробуйте опубликовать небольшой образец репликации проблемы. В вашем коде должно быть что-то, потому что на уровне фреймворка он должен работать нормально. - person Rohit Vats; 28.01.2014
comment
Хороший. Я должен оставить HorizontalAlignement = Right на DockPanel, поскольку он выравнивает кнопки по левому краю, если я не устанавливаю его. - person no9; 28.01.2014
comment
Спасибо за помощь! - person no9; 28.01.2014