WPF Grid vs Stackpanel
Для макета WPF/Silverlight лучше использовать сетку с множеством строк и столбцов или тоннами стековых панелей?
7 ответов
Вы должны использовать Grid, если вам нужно, чтобы вещи располагались горизонтально и вертикально. Используйте StackPanel для создания строки или столбца, когда эти вещи не должны совпадать с чем-либо еще.
Однако не ограничивайте себя этими двумя вариантами. В частности, посмотрите на DockPanel. Это немного сложнее, чем StackPanel, но его разметка не так загромождена, как Grid. Вот хорошая статья о DockPanel:
Контейнер, который вы используете, должен основываться на содержании, а не на том, лучше ли один подход, чем другой. Если вам нужно, чтобы вещи располагались как по горизонтали, так и по вертикали, вам действительно следует использовать сетку. Но кроме этого, это действительно зависит от контента, который вы намереваетесь отображать.
Я не думаю, что Grid - лучшая идея.
например, если вы хотите вставить строку в существующий документ макета сетки (в середине)
если существующий ряд равен 1,2,3,4, то необходимо вставить новый ряд между 1 и 2.
тогда вам пришлось изменить 2,3,4 на 3,4,5 (найти все теги изменения....)
Подумайте, если в одной строке 3–5 столбцов... переупорядочивать все цифровые данные - грязная работа!!!
Я думаю, что Grid - лучшая идея. Я обычно настраиваю общий макет с помощью Grid и использую несколько стековых панелей, чтобы кое-что сделать. У меня также есть ощущение, что с гридами производительность выше, и что гриды обычно дают вам больше гибкости.
Я предпочитаю StackPanel, потому что мне проще вносить изменения при вставке новых элементов, строк или столбцов. С сеткой вам нужно прочитать номера строк и столбцов, чтобы узнать, где вы находитесь. Со StackPanel вы просто следуете за вложением, это проще и менее грязно, чем сетка.
Например, на странице XAML я использую панель горизонтального стека, как родительскую сетку, а затем, если мне нужен столбец, у меня есть отдельная "вертикальная" вложенная панель стека. Таким образом, горизонтальная панель стека становится "сеткой", а вложенная вертикальная панель стека становится столбцами. Мне легче читать и изменять строки и столбцы в сетке.
Оба имеют силу (Сетка / Стеклопанель). Проблема с Grid заключается в реструктуризации линий. Проблема со Stackpanel заключается в том, что нет структуры таблицы (фиксированная ширина столбцов). Поэтому я думаю, что это хорошее решение этой проблемы:-)
Определение стилей
<Page.Resources>
<Style x:Key="LabelCol1" TargetType="Label">
<Setter Property="Width" Value="200" />
</Style>
<Style x:Key="EditCol2" TargetType="TextBox">
<Setter Property="Width" Value="250" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="Margin" Value="3" />
</Style>
<Style x:Key="ButtonCol3" TargetType="Button">
<Setter Property="Width" Value="120" />
<Setter Property="Margin" Value="3" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</Page.Resources>
И используя стили в Stackpanel
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label Style="{StaticResource LabelCol1}" Content="Solution path" />
<TextBox Style="{StaticResource EditCol2}" />
<Button Style="{StaticResource ButtonCol3}" Content="Open..." />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Style="{StaticResource LabelCol1}" Content="Solution name" />
<TextBox Style="{StaticResource EditCol2}" />
</StackPanel>
</StackPanel>
У меня нет опыта работы с таким макетом, но я готов поспорить, что сетка легче рендерить, чем множество вложенных стековых панелей.