我有一个简单的网格,其中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
?我觉得我正在重新发明轮子,但由于我从未做过可折叠面板这一事实,这感觉就像是完成它的一种自然方式。
答案 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;
}
如果想避免代码隐藏,也可以通过样式触发器执行此操作。 如果您不喜欢扩展箭头图标并想要替换它(例如通过垂直线),则需要为其创建自定义控件模板。