Для справки, давайте пронумеруем элементы StackPanel
из вашего исходного XAML:
<StackPanel #1>
<StackPanel #2 Orientation="Horizontal">
<StackPanel #3>
<Expander>...</Expander>
</StackPanel>
<StackPanel #4>
<Button ... /><Button ... /><Button ... />
</StackPanel>
</StackPanel>
<StackPanel #5 Orientation="Horizontal">
<DataGrid ... />
</StackPanel>
</StackPanel>
StackPanel
при горизонтальной ориентации устанавливает свою высоту равной высоте своего самого высокого дочернего элемента, а при вертикальной ориентации устанавливает свою высоту равной сумме всех высот его дочерних элементов.
Когда вы расширяете элемент управления Expander
, вы увеличиваете его высоту и, следовательно, увеличиваете высоту его контейнера (#3). Это, в свою очередь, может увеличить или не увеличить высоту родительского контейнера №3 (№2) в зависимости от того, станет ли расширитель больше по высоте, чем панель стека, содержащая кнопки (№4).
Чтобы добиться эффекта, который вам, кажется, нужен, вы можете либо использовать Grid
, как уже обсуждалось в вопросе и другом ответе, либо вы можете использовать элемент Canvas
следующим образом:
<Window x:Class="..."
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<StackPanel Orientation="Horizontal" Panel.ZIndex="1">
<Canvas Width="{Binding ActualWidth, ElementName=Expander}">
<Expander x:Name="Expander" Header="Header" Background="Yellow">
<StackPanel Background="Aqua">
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
</StackPanel>
</Expander>
</Canvas>
<StackPanel>
<Button Content="Button1" />
<Button Content="Button2" />
<Button Content="Button3" />
</StackPanel>
</StackPanel>
<TextBlock Text="Some more text" Background="LimeGreen" />
</StackPanel>
</Window>
Используемый здесь холст позволяет элементу управления расширения «выходить» за границы контейнера. Чтобы элемент управления расширения «плавал» над элементом, находящимся непосредственно под ним (в данном примере это TextBlock
), используется присоединенное свойство Panel.ZIndex
. Нам также нужно привязать ширину холста к ширине расширителя, так как холст не будет изменять свой размер в зависимости от своих дочерних элементов.
Вот как это выглядит, когда расширитель свернут:
![](https://i.imgur.com/tF78P93.png)
И как это выглядит в развернутом виде:
![](https://i.imgur.com/cC53e6O.png)
(Простите за ужасные цвета, они только для того, чтобы вы могли видеть, где находятся контрольные границы).
person
Steven Rands
schedule
05.02.2015
Popup
илиComboBox
вместо расширителя? - person Sphinxxx   schedule 04.02.2015