Можно ли легко указать поля и / или отступы для строк или столбцов в сетке WPF?
Конечно, я мог бы добавить дополнительные столбцы для разметки, но это похоже на работу с отступами / полями (это даст намного более простой XAML). Кто-то извлек из стандартной Grid эту функциональность?
Ответы:
Вы можете написать свой собственный
GridWithMargin
класс, унаследованный отGrid
, и переопределитьArrangeOverride
метод, чтобы применить поляисточник
RowDefinition
иColumnDefinition
имеют типContentElement
, иMargin
является строгоFrameworkElement
свойством. Таким образом, на ваш вопрос «возможно ли это легко» ответ является наиболее определенным нет. И нет, я не видел никаких макетов панелей, демонстрирующих такую функциональность.Вы можете добавить дополнительные строки или столбцы, как вы предложили. Но вы также можете установить поля для
Grid
самого элемента или всего, что будет внутриGrid
, так что это ваш лучший обходной путь.источник
Используйте элемент
Border
управления вне элемента управления ячейки и определите для этого отступ:Источник:
источник
Вы можете использовать что-то вроде этого:
Или, если вам не нужны TemplateBindings:
источник
Думаю, я бы добавил свое собственное решение, потому что никто еще не упомянул об этом. Вместо того, чтобы создавать UserControl на основе Grid, вы можете настроить элементы управления, содержащиеся в grid, с помощью декларации стиля. Заботится о добавлении отступов / полей ко всем элементам без необходимости определения для каждого, что является громоздким и трудоемким. Например, если ваша таблица не содержит ничего, кроме TextBlocks, вы можете сделать это:
Что похоже на «заполнение ячейки».
источник
Margin
свойства, оно заключается в том, что любое изStyle
inResourceDictionary
будет применяться к каждому элементу егоTargetType
везде во всей области действия элемента-владельца этого словаря. Так что это то,Style
что сочится, а не собственность.Это не очень сложно. Не могу сказать, насколько сложно было в 2009 году, когда был задан вопрос, но это было тогда.
Обратите внимание, что если вы явно задаете поле непосредственно для дочернего элемента сетки при использовании этого решения, это поле будет отображаться в конструкторе, но не во время выполнения.
Это свойство может быть применено к Grid, StackPanel, WrapPanel, UniformGrid или любому другому потомку Panel. Это влияет на непосредственных детей. Предполагается, что дети захотят управлять макетом своего содержимого.
PanelExt.cs
Демо-версия:
MainWindow.xaml
MainWindow.xaml.cs
источник
build
или,run
прежде чем живой предварительный просмотр может быть отображен? Хороший и простой. 1 вверхЯ столкнулся с этой проблемой при разработке программного обеспечения недавно, и мне пришло в голову спросить, ПОЧЕМУ? Почему они сделали это ... ответ был прямо передо мной. Строка данных является объектом, поэтому, если мы сохраняем ориентацию объекта, то дизайн отдельной строки должен быть отделен (предположим, что вам понадобится повторно использовать отображение строки позже в будущем). Поэтому я начал использовать панели стека с привязкой к данным и настраиваемые элементы управления для большинства отображений данных. Списки появлялись время от времени, но в основном сетка использовалась только для первичной организации страницы (заголовок, область меню, область содержимого, другие области). Ваши пользовательские объекты могут легко управлять любыми требованиями к расстоянию для каждой строки на панели стека или в сетке (одна ячейка сетки может содержать весь объект строки. Это также дает дополнительное преимущество правильной реакции на изменения ориентации,
или
Ваши пользовательские элементы управления также наследуют DataContext, если вы используете привязку данных ... мое личное любимое преимущество этого подхода.
источник
ListView
вGridView
режиме, но без каких-либо условий, чтобы все «RowObjects» имели одинаковую ширину столбца. В действительности это больше не имеет ничего общего с сеткой.в uwp (версия Windows10FallCreatorsUpdate и выше)
источник
Xamarin.Forms
.Отредактировано:
Чтобы добавить поле любому элементу управления, вы можете обернуть элемент управления границей, например так
источник
Я сделал это прямо сейчас с одной из моих сеток.
источник
Одна из возможностей - добавить строки и столбцы фиксированной ширины, которые будут действовать как искомый отступ / отступ.
Вы также можете учитывать, что вы ограничены размером вашего контейнера, и что сетка станет такой же большой, как содержащий элемент или его заданные ширина и высота. Вы можете просто использовать столбцы и строки без заданной ширины или высоты. Таким образом, они по умолчанию равномерно разбивают общее пространство в сетке. Тогда это будет просто вопрос центрирования ваших элементов по вертикали и горизонтали в вашей сетке.
Другой метод может заключаться в том, чтобы обернуть все элементы сетки в фиксированную сетку из одной строки и столбца, которая имеет фиксированный размер и поле. Что ваша сетка содержит фиксированные поля ширины / высоты, которые содержат ваши фактические элементы.
источник
Недавно у меня была похожая проблема в сетке из двух столбцов, мне нужно было поле только для элементов в правом столбце. Все элементы в обоих столбцах имели тип TextBlock.
источник
Хотя вы не можете добавить поле или отступ в Grid, вы можете использовать что-то вроде фрейма (или аналогичного контейнера), к которому вы можете применить его.
Таким образом (если вы показываете или скрываете элемент управления при нажатии кнопки, скажем), вам не нужно добавлять поля для каждого элемента управления, который может с ним взаимодействовать.
Думайте об этом как об изоляции групп элементов управления в единицах, затем применяя стиль к этим единицам.
источник
Как было сказано ранее, создайте класс GridWithMargins. Вот мой пример рабочего кода
Использование:
источник
Я удивлен, что еще не видел этого решения.
Исходя из Интернета, фреймворки, такие как начальная загрузка, будут использовать отрицательное поле для возврата строк / столбцов.
Это может быть немного многословно (хотя и не так уж плохо), это работает, и элементы равномерно распределены и измерены.
В приведенном ниже примере я использую
StackPanel
корень, чтобы продемонстрировать, как 3 кнопки равномерно распределены с помощью полей. Вы можете использовать другие элементы, просто измените внутренний x: Type с кнопки на ваш элемент.Идея проста: использовать сетку снаружи, чтобы вытащить поля элементов за их пределы на половину внутренней сетки (используя отрицательные поля), используйте внутреннюю сетку, чтобы равномерно распределить элементы по желаемому количеству.
Обновление: в некоторых комментариях от пользователя сказано, что это не работает, вот краткое видео, демонстрирующее: https://youtu.be/rPx2OdtSOYI
источник
Иногда простой метод является лучшим. Просто дополните свои строки пробелами. Если это всего лишь несколько текстовых полей и т. Д., То это самый простой метод.
Вы также можете просто вставить пустые столбцы / строки с фиксированным размером. Чрезвычайно просто, и вы можете легко изменить его.
источник