как расширить содержимое WPF GridRow в следующую строку без расширения текущей строки

Я новичок в WPF и пытаюсь создать раскрывающееся меню с помощью расширителя. Макет страницы обрабатывается с помощью Grid.

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

Я пробовал играть с ZIndex из Expander, но, похоже, это не дало никакого эффекта. Несмотря ни на что, строка всегда расширяется, заставляя двигаться все остальное на странице.

<Expander FontSize="18" Name="moduleSelect" Width="100" Header=" Goto -> " 
          Background="#000033" MouseEnter="moduleSelect_MouseEnter" 
          MouseLeave="moduleSelect_MouseLeave" Foreground="White"
          Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Left">
    <StackPanel>
        <Button Name="btnTasks" Width="100" Foreground="White"
                Background="#000033">Tasks</Button>
        <Button Name="btnNotes" Width="100" Foreground="White"
                Background="#000033">Notes</Button>
    </StackPanel>
</Expander>

Как я могу заставить это расширяться «выше» последующих строк, не искажая сетку?


person Remoh    schedule 29.01.2010    source источник


Ответы (3)


Что произойдет, если вы установите Grid.RowSpan из Expander на 2 (или сколько строк вы хотите, чтобы он охватывал при расширении)?

Итак, для двухстрочной сетки у вас будет что-то вроде этого:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30" /> <!--set this to the height of the expander's header area-->
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <WhateverGoesInRow2 Grid.Row="1" />
    <Expander FontSize="18" Name="moduleSelect" Width="100" Header=" Goto -> " 
        Background="#000033" MouseEnter="moduleSelect_MouseEnter" 
        MouseLeave="moduleSelect_MouseLeave" Foreground="White"
        Grid.Column="0" Grid.ColumnSpan="3" HorizontalAlignment="Left"
        Grid.Row=0 Grid.RowSpan="2">
        <StackPanel>
            <Button Name="btnTasks" Width="100" Foreground="White" Background="#000033">Tasks</Button>
            <Button Name="btnNotes" Width="100" Foreground="White" Background="#000033">Notes</Button>
        </StackPanel>
    </Expander>
</Grid>

Возможно, вам придется настроить раздел RowDefinition для вашей конкретной ситуации, но если я правильно понимаю вашу проблему, я думаю, что это сработает.

person devuxer    schedule 29.01.2010
comment
Не сдвинет ли это все в столбце вниз на одну строку, пока расширитель открыт? - person Robert Rossney; 30.01.2010
comment
@ Роберт, не должно. В этом весь смысл Grid.RowSpan="2". Это заставляет объект занимать обе строки Grid. Установив высоту сетки на высоту заголовка, когда вы открываете расширитель, все переполнение (выскочившее-открытое содержимое) перейдет во вторую строку. - person devuxer; 30.01.2010
comment
@ Роберт, я только что внес незначительные изменения в свой ответ. Я думаю, что Z-порядок зависит от того, что вы сначала поместите в свой XAML (хотя вы, вероятно, можете переопределить его, если хотите), поэтому я поставил WhateverGoesInRow2 перед расширителем. Это должно заставить расширитель появляться над другими вещами, когда он открыт. - person devuxer; 30.01.2010
comment
Ни установка rowspan на 2, ни перемещение определения Expander в нижнюю часть содержимого Grid не работают. Я также установил Z-Index в моем коде onMouseEnter, но это тоже не сработало. В каждом случае строка расширяется вместо отображения меню сверху. Использование ContexMenu или Combobox будет работать, но я искал простой способ сделать это без необходимости изменения стиля каких-либо элементов управления. Если бы я мог просто заставить его отображаться поверх сетки, расширитель был бы идеальным. Спасибо за помощь! - person Remoh; 01.02.2010
comment
Хорошо, поиграв с подходом ToggleButton/Popup, я смог заставить его выглядеть и работать так же, как расширитель. Кажется, это самый простой путь. - person Remoh; 01.02.2010

Вам нужно что-то, что всплывает над сеткой, а не расширяется внутри сетки. ComboBox, скажем, или - в конце концов, это меню - ContextMenu.

Вы также можете создать некоторую комбинацию ToggleButton и Popup, но это, по сути, то же самое, что и ComboBox с отключенным IsEditable.

person Robert Rossney    schedule 29.01.2010

Встроенный раскрывающийся элемент управления использует элемент управления Popup в своем шаблоне элемента управления по умолчанию, чтобы делать то же самое.

person Mike Schenk    schedule 29.01.2010