WPF Grid vs Stackpanel

Для макета WPF/Silverlight лучше использовать сетку с множеством строк и столбцов или тоннами стековых панелей?

7 ответов

Решение

Вы должны использовать Grid, если вам нужно, чтобы вещи располагались горизонтально и вертикально. Используйте StackPanel для создания строки или столбца, когда эти вещи не должны совпадать с чем-либо еще.

Однако не ограничивайте себя этими двумя вариантами. В частности, посмотрите на DockPanel. Это немного сложнее, чем StackPanel, но его разметка не так загромождена, как Grid. Вот хорошая статья о DockPanel:

Использование DockPanel в Silverlight 2

Контейнер, который вы используете, должен основываться на содержании, а не на том, лучше ли один подход, чем другой. Если вам нужно, чтобы вещи располагались как по горизонтали, так и по вертикали, вам действительно следует использовать сетку. Но кроме этого, это действительно зависит от контента, который вы намереваетесь отображать.

Я не думаю, что 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>

У меня нет опыта работы с таким макетом, но я готов поспорить, что сетка легче рендерить, чем множество вложенных стековых панелей.

Другие вопросы по тегам