这是在WPF中折叠和恢复内容的合适方式吗?

时间:2014-04-07 07:10:47

标签: c# wpf

我有一个简单的网格,其中ListView占据最左边的列:

<Grid Background="Black">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"  x:Name="leftColumn"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <GridSplitter Grid.Column="1" HorizontalAlignment="Left" Margin="0" Width="2"
                  Background="#FF4B4B4B" Grid.RowSpan="2" 
                  MouseDoubleClick="GridSplitter_MouseDoubleClick"/>
    <ListView x:Name="lvSubjects" Background="#FF2E2E2E" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="120"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

这是我的代码,允许我折叠并将最左边的列及其内容恢复到原始状态:

private void GridSplitter_MouseDoubleClick(object sender,
                                           System.Windows.Input.MouseButtonEventArgs e)
{
    if (leftColumn.Width != GridLength.Auto)
    {
        lvSubjects.Width = leftColumn.Width.Value;
    }

    leftColumn.Width = GridLength.Auto;

    if (lvSubjects.Visibility == Visibility.Visible)
    {
        lvSubjects.Visibility = Visibility.Collapsed;
    }
    else
    {
        lvSubjects.Visibility = Visibility.Visible;
    }
}

请注意,在折叠或恢复之前,我被迫执行整个宽度例程,因为当使用{{1}重新调整列的宽度时,列的宽度从Auto变为静态数字}}。这种方法不是很精致,取决于你如何做,可能无法很好地发挥作用。示例:如果将GridSplitter一直拖到左侧,请双击然后将其拖出,GridSplitter将不会展开。在我发现自己是否应该这样做之前,我不想进一步发展它。当我完成这部分时,我突然意识到了。

我的问题是:我应该做我在这里做的事情,还是应该使用ListView?我觉得我正在重新发明轮子,但由于我从未做过可折叠面板这一事实,这感觉就像是完成它的一种自然方式。

1 个答案:

答案 0 :(得分:0)

使用扩展器会更干净,我认为对用户来说更直观。 但是,如果您还需要更改列宽,则仍需要GridSplitter。

    <Grid Background="Black">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"  x:Name="leftColumn"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>

    <Expander Grid.Column="0" IsExpanded="False" ExpandDirection="Left" 
              Collapsed="Expander_Collapsed_1">
        <ListView x:Name="lvSubjects" Background="#FF2E2E2E" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="120"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Expander>

    <GridSplitter Grid.Column="1" HorizontalAlignment="Left" Margin="0" Width="2"
              Background="#FF4B4B4B" Grid.RowSpan="2" />
</Grid>

如果在展开后使用分割器,则可以通过在colapsed事件中将其设置回“自动”来缩小项目的宽度:

    private void Expander_Collapsed_1(object sender, RoutedEventArgs e)
    {
        leftColumn.Width = GridLength.Auto;
    }

如果想避免代码隐藏,也可以通过样式触发器执行此操作。 如果您不喜欢扩展箭头图标并想要替换它(例如通过垂直线),则需要为其创建自定义控件模板。