Учитывая StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
Каков наилучший способ разнести дочерние элементы так, чтобы между ними были зазоры одинакового размера, даже если сами дочерние элементы имеют разные размеры? Можно ли это сделать, не устанавливая свойства для каждого из дочерних элементов?
wpf
silverlight
xaml
stackpanel
GraemeF
источник
источник
Ответы:
Используйте Margin или Padding, примененные к области внутри контейнера:
РЕДАКТИРОВАТЬ: Если вы хотите повторно использовать поле между двумя контейнерами, вы можете преобразовать значение поля в ресурс во внешней области, например
а затем сослаться на это значение во внутренней области видимости
источник
Button
.Label
вы должны использоватьPadding
вместоMargin
Другой хороший подход можно увидеть здесь: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between- items-in-stackpanel.aspx Ссылка не работает -> это веб- архив этой ссылки.
Он показывает, как создать прикрепленное поведение, чтобы такой синтаксис работал:
Это самый простой и быстрый способ установить маржу для нескольких дочерних элементов панели, даже если они не одного типа. (Т.е. кнопки, текстовые поля, комбинированные списки и т. Д.)
источник
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
перед фактической установкой поля дочернего элемента позволяет вручную указывать поля для некоторых элементов.Я улучшил ответ Элада Каца .
Исходный код в гисте .
Пример:
источник
ItemsControl
привязке к изменяющейся коллекции. Предполагается, что элементы статичны с момента возникновенияLoad
события родителя .То, что вы действительно хотите сделать, это обернуть все дочерние элементы. В этом случае вы должны использовать элемент управления элементами и не прибегать к ужасным прикрепленным свойствам, которые в конечном итоге будут иметь миллион на каждое свойство, которое вы хотите стилизовать.
источник
Margin="0 0 -5 0"
) также будет противодействовать интервалу после последнего элемента в списке.+1 за ответ Сергея. И если вы хотите применить это ко всем вашим StackPanels, вы можете сделать это:
Но будьте осторожны: если вы определите такой стиль в своем App.xaml (или другом словаре, который объединен с Application.Resources), он может переопределить стиль элемента управления по умолчанию. Для большинства элементов управления без внешнего вида, таких как панель стека, это не проблема, но для текстовых полей и т. Д. Вы можете столкнуться с этой проблемой , которая, к счастью, имеет некоторые обходные пути.
источник
Следуя совету Сергея, вы можете определить и повторно использовать весь Стиль (с различными установщиками свойств, включая Маржу) вместо просто объекта Толщина:
...
Обратите внимание, что хитрость здесь заключается в использовании наследования стилей для неявного стиля, унаследованного от стиля в некотором внешнем (возможно, объединенном из внешнего файла XAML) словаре ресурсов.
Примечание:
Сначала я наивно пытался использовать неявный стиль, чтобы установить свойство Style элемента управления для этого внешнего ресурса Style (скажем, определенного с помощью ключа «MyStyle»):
что привело к немедленному завершению работы Visual Studio 2010 с ошибкой CATASTROPHIC FAILURE (HRESULT: 0x8000FFFF (E_UNEXPECTED)), как описано на странице https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails -с-катастрофический безотказный-когда-а-стиль-нах к набору стиль-свойство #
источник
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing теперь находятся на предварительном просмотре UWP, все позволит лучше соответствовать тому, что запрашивается здесь.
Эти свойства в настоящее время доступны только в пакете обновления 10 для Windows 10 Fall Creators Update Insider, но они должны быть в полной мере!
источник
UniformGrid может быть недоступен в Silverlight, но кто-то перенес его из WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/
источник
Мой подход наследует StackPanel.
Использование:
Все, что нужно, это следующий короткий класс:
источник
иногда вам нужно установить отступы, а не поля, чтобы пространство между элементами было меньше, чем по умолчанию
источник