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 ответ:
Если вы не задаете какие-либо строки или столбцы, то каждый из них является неявным, что дает вам одну ячейку сетки. Таким образом, и
Если бы вы использовалиEllipse
, иContentPresenter
занимают одну и ту же ячейку сетки. Z-порядок элементов, добавляемых в одну ячейку, определяется порядком их добавления. В этом случаеContentPresenter
появится "поверх"Ellipse
.Canvas
вместоGrid
, размер детей не был бы ограничен размером контейнера. Это потому, что ACanvas
делает не накладывать никаких ограничений размера на своих детей, как это делаетGrid
. Поэтому вам придется указать размер дляEllipse
иContentPresenter
, и вам нужно будет знать размерCanvas
, чтобы установить этот размер. Следовательно, это просто намного проще и интуитивно понятнее, используяGrid
.