【问题标题】:how to extend WPF GridRow Contents into next row without expanding the current row如何在不扩展当前行的情况下将 WPF GridRow 内容扩展到下一行
【发布时间】:2010-01-29 19:57:25
【问题描述】:

我是 WPF 新手,我正在尝试使用扩展器构建一个下拉菜单。页面布局正在使用Grid 处理。

扩展器位于网格的第一行内,我希望扩展器的内容在单击时扩展到下面所有内容的顶部。不幸的是,现在,整行都被扩展以适应扩展控件的高度。

我尝试使用ExpanderZIndex,但它似乎没有任何效果。无论如何,该行总是会扩展,迫使页面上的其他所有内容移动。

<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>

如何在不扭曲网格的情况下使其扩展“高于”后续行?

【问题讨论】:

    标签: wpf wpf-controls grid wpfdatagrid


    【解决方案1】:

    如果您将ExpanderGrid.RowSpan 设置为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 部分,但如果我正确理解您的问题,我认为这会起作用。

    【讨论】:

    • 在展开器打开时,这不会将列中的所有内容都向下推一排吗?
    • @Robert,不应该。这就是Grid.RowSpan="2" 的重点。它使一个对象占据Grid 的两行。通过将网格的高度设置为标题的高度,当您打开扩展器时,所有溢出(弹出打开的东西)都会进入第二行。
    • @Robert,我刚刚对我的回答做了一个小的修改。我认为 Z 顺序取决于您首先放入 XAML 中的内容(尽管您可以根据需要覆盖它),所以我将 WhateverGoesInRow2 放在扩展器之前。这应该使扩展器在打开时出现在其他东西上方。
    • 将 rowspan 设置为 2 或将 Expander 定义移动到 Grid 内容的底部都不起作用。我还在我的代码 onMouseEnter 中设置了 Z-Index,但这也不起作用。在每种情况下,该行都会扩展,而不是在顶部呈现菜单。使用 ContexMenu 或 Combobox 会起作用,但我一直在寻找一种简单的方法来做到这一点,而无需重新设置任何控件的样式。如果我可以让它显示在网格的顶部,扩展器将是完美的。感谢您的帮助!
    • 好的,在使用了 ToggleButton / Popup 方法之后,我能够让它的外观和工作方式与扩展器相同。这似乎是最简单的方法。
    【解决方案2】:

    您想要在网格上弹出的东西,而不是在网格内展开。比如说ComboBox,或者——毕竟这是一个菜单——ContextMenu

    您还可以构建ToggleButtonPopup 的某种组合,但这与关闭IsEditableComboBox 基本相同。

    【讨论】:

      【解决方案3】:

      内置的下拉控件利用其默认控件模板中的 Popup 控件来执行类似的操作。

      【讨论】:

        猜你喜欢
        • 2020-09-07
        • 2016-04-03
        • 2021-04-06
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        相关资源
        最近更新 更多