将扩展器和网格组合(可调整大小的扩展器)

17

我想要一个可调整大小的Expander。我的基本想法是这样的:

<Grid HorizontalAlignment="Left">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="2" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Expander Grid.Column="0" ExpandDirection="Right">
          ...
    </Expander>

    <GridSplitter Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />

    ...
</Grid>

这个问题是:如果我移动网格分隔符并折叠展开器,就会得到一个巨大的空白区域。如何才能使整列折叠?或者是否有另一种方法使展开器"可调大小"。


我曾经遇到过同样的问题,这是我的解决方案 - Bashnia007
2个回答

21

我不确定你试图实现什么,但我认为在概念上,Grid 应该是 Expander.Content 的一部分,这对你有用吗?

<Expander Header="Test" ExpandDirection="Right" HorizontalAlignment="Left" Background="LightBlue">
    <Expander.Content>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="5"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="Lorem ipsum dolor sit"/>
            <GridSplitter Grid.Column="1" Width="5" ResizeBehavior="PreviousAndCurrent" ResizeDirection="Columns"/>
        </Grid>
    </Expander.Content>
</Expander>

编辑: 移除了第一列中似乎不必要的触发器。

此外: 要使此垂直工作,GridSplitterHorizontalAlignment必须设置为Stretch,否则它将默认为零宽度(当然,所有其他方向相关的内容也必须适应,但这很容易)

HorizontalAlignment是Microsoft .NET的属性访问器,实际上它是一个依赖属性。对于这个特定的依赖属性,子类元素(特别是控件)中其表面上的“默认”值经常被设置为不同的值。[...]例如,Label控件的表面上“默认”的HorizontalAlignment将为Left,即使Label直接从FrameworkElement继承了HorizontalAlignment。这是因为该值在Label的默认样式中被重置,在样式的控件模板中进行了设置。


我真的无法让像这样的东西水平工作! - DaveO
@DaveO:请看我在答案中的注释。 - H.B.
更新示例以具有“水平对齐”。 - Dennis

1

也许这可以帮助解决你的“列折叠”问题

XAML:

<Grid>中添加Name="expGrid",并在<Expander>中添加Collapsed="Expander_Collapsed"

C# 代码:

private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
  var colomnIndex = Grid.GetColumn(sender as Expander);
  var colomn = expGrid.ColumnDefinitions[colomnIndex];
  colomn.Width = GridLength.Auto;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接