WPF control-template: зачем указывать сетку без ColumnDefinations/RowDefinations в качестве элемента outter?


Я читал Программирование 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>
Мне интересно, почему вы используете сетку, а не более простую панель, такую как холст? Поскольку мы не decalre любой строки/столбцы?

Спасибо!

1 2

1 ответ:

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

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