WPF control-template: зачем указывать Grid без ColumnDefination / RowDefination в качестве внешнего элемента? - PullRequest
2 голосов
/ 15 ноября 2009

Я читал Программирование WPF, вот один из примеров шаблона управления:

<Button DockPanel.Dock="Bottom" x:Name="addButton" Content="Add">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Ellipse Width="128" Height="32" Fill="Yellow" Stroke="Black" />
                <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" />
            </Grid>
        </ControlTemplate>
    </Button.Template>
</Button>

Мне интересно, зачем использовать сетку, а не более простую панель, такую ​​как canvas? Так как мы не удалили строки / столбцы?

Спасибо!

1 Ответ

2 голосов
/ 15 ноября 2009

Если вы не укажете какие-либо строки или столбцы, один из них будет неявным, поэтому вы получите одну ячейку сетки. Таким образом, и Ellipse, и ContentPresenter занимают одну и ту же ячейку сетки. Z-порядок элементов, добавляемых в одну и ту же ячейку, определяется порядком их добавления. В этом случае ContentPresenter появится «поверх» Ellipse.

Если бы вы использовали Canvas вместо Grid, размер дочерних элементов не будет ограничен размером контейнера. Это потому, что Canvas не накладывает никаких ограничений на размер своих дочерних элементов, как Grid. Поэтому вам нужно будет указать размер как для Ellipse, так и для ContentPresenter, и вам потребуется знать размер Canvas, чтобы установить этот размер. Ergo, с помощью Grid.

все намного проще и интуитивно понятнее.
...