C# 使用GridSplitter隐藏列并自动调整其大小
我有一个项目,有一个标题行和一个内容行。内容行分为3列(GroupBox)。这3列是用GridSplitter实现的 源代码:C# 使用GridSplitter隐藏列并自动调整其大小,c#,.net,wpf,xaml,gridsplitter,C#,.net,Wpf,Xaml,Gridsplitter,我有一个项目,有一个标题行和一个内容行。内容行分为3列(GroupBox)。这3列是用GridSplitter实现的 源代码: 隐藏C0 隐藏C1 隐藏C2 我点击HideColumn1Button,第1列是隐藏的,但其他两列的宽度与之前相同。但是我想,第0列和第2列自动调整为完整宽度 你们中有人知道怎么做吗?你们的布尔可见性Converter需要返回可见性。折叠的,而不是可见性。隐藏的。这在视觉上等同于将宽度设置为0 编辑 在代码中的某个地方找到您对BooleantVisibility
隐藏C0
隐藏C1
隐藏C2
我点击HideColumn1Button,第1列是隐藏的,但其他两列的宽度与之前相同。但是我想,第0列和第2列自动调整为完整宽度
你们中有人知道怎么做吗?你们的
布尔可见性Converter
需要返回可见性。折叠的,而不是可见性。隐藏的。这在视觉上等同于将宽度设置为0
编辑
在代码中的某个地方找到您对BooleantVisibilityConverter
的定义
您应该只有3列。将GridSplitter
s放入第1列和第2列,HorizontalAlignment=“Left”。对于每个GroupBox
setMargin=“5,0,0,0”
如果您希望使用复选框绑定它,那么您可以尝试以下代码,只需使用它构建一个库并使用扩展列定义。礼貌(不朽)
或者,在按钮_单击或复选框_选中时,您可以编写代码(我将网格命名为testgrid),记住还要添加反向代码:
testgrid.ColumnDefinitions[0].Width = new GridLength(0);
testgrid.ColumnDefinitions[0].MinWidth = 0;
一个更扩展的版本是编写自己的故事板,但上面两个应该会有所帮助
问候
Kajal如何创建占用列的GridSplitter
若要指定占用网格中某列的GridSplitter,请将“column attached”属性设置为要调整大小的列之一。如果网格有多行,请将RowSpan attached属性设置为行数。然后将“水平对齐”设置为“中心”,将“垂直对齐”属性设置为“拉伸”,并将包含GridSplitter的列的宽度设置为“自动”
下面的示例演示如何定义垂直GridSplitter,该GridSplitter占用列并调整列两侧的列大小。
学分:
..
请尝试验证BooleantVisibilityConverter
是否需要返回可见性。折叠的,而不是可见性。隐藏的
对于第0列,您应该只有3列具有Auto
宽度。将网格拆分器放在第1列和第2列中
以下是我尝试的代码:
<Window
x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewMenu="clr-namespace:Cons.ViewMenu"
Title="Test Gridsplitter"
Height="700"
Width="1000">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- Row 0 -->
<GroupBox Name="Menu" Grid.Row="0">
<StackPanel>
<ToggleButton x:Name="HideColumn0Button" IsChecked="True" Width="80" Height="40">Hide C0</ToggleButton>
<ToggleButton x:Name="HideColumn1Button" IsChecked="True" Width="80" Height="40">Hide C1</ToggleButton>
<ToggleButton x:Name="HideColumn2Button" IsChecked="True" Width="80" Height="40">Hide C2</ToggleButton>
</StackPanel>
</GroupBox>
<!-- Row 1 -->
<GroupBox Name="Body" Grid.Row="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" MinWidth="150"/>
<ColumnDefinition Width="*" MinWidth="150"/>
</Grid.ColumnDefinitions>
<!-- Column 0 -->
<GroupBox Header="Column 0"
Name="ds"
Margin="5,0,0,0"
Grid.Row="0"
Width="150"
Grid.Column="0"
Visibility="{Binding Path=IsChecked, ElementName=HideColumn0Button, Converter={StaticResource BoolToVisConverter}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
</StackPanel>
</Grid>
</GroupBox>
<!-- Column 1 -->
<GroupBox Header="Column 1"
Grid.Row="0"
Grid.Column="1"
Margin="5,0,0,0"
Visibility="{Binding Path=IsChecked, ElementName=HideColumn1Button, Converter={StaticResource BoolToVisConverter}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
</StackPanel>
</Grid>
</GroupBox>
<!-- Column 2 -->
<GroupBox Header="Column 2"
Grid.Row="0"
Margin="5,0,0,0"
Grid.Column="2"
Visibility="{Binding Path=IsChecked, ElementName=HideColumn2Button, Converter={StaticResource BoolToVisConverter}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
</StackPanel>
</Grid>
</GroupBox>
//Put the GridSplitters in Columns 1 and 2, HorizontalAlignment="Left".
<GridSplitter Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="5"/>
<GridSplitter Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="5"/>
</Grid>
</GroupBox>
</Grid>
</Window>
隐藏C0
隐藏C1
隐藏C2
//将网格拆分器放在第1列和第2列中,HorizontalAlignment=“Left”。
藏前
隐藏后
您可能需要调整网格的列定义,请共享您的完整代码,以便我们可以查看。您是指完整的XAML代码还是完整的cs代码?可能是您问题中涉及的所有内容。我将编辑我的问题,请稍等:)嗨,克鲁格玛。你能解释一下我应该在哪里以及如何做吗?如果我设置groupbox column1 Visibility=“Collapsed”,其他列不会自动调整大小。这是问题的一部分吗?请添加此文本/代码的源代码,否则是剽窃。
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition/>
</Grid.ColumnDefinitions>
..
<GridSplitter Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Stretch"
Background="Black"
ShowsPreview="True"
Width="5"
/>
<Window
x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewMenu="clr-namespace:Cons.ViewMenu"
Title="Test Gridsplitter"
Height="700"
Width="1000">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- Row 0 -->
<GroupBox Name="Menu" Grid.Row="0">
<StackPanel>
<ToggleButton x:Name="HideColumn0Button" IsChecked="True" Width="80" Height="40">Hide C0</ToggleButton>
<ToggleButton x:Name="HideColumn1Button" IsChecked="True" Width="80" Height="40">Hide C1</ToggleButton>
<ToggleButton x:Name="HideColumn2Button" IsChecked="True" Width="80" Height="40">Hide C2</ToggleButton>
</StackPanel>
</GroupBox>
<!-- Row 1 -->
<GroupBox Name="Body" Grid.Row="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" MinWidth="150"/>
<ColumnDefinition Width="*" MinWidth="150"/>
</Grid.ColumnDefinitions>
<!-- Column 0 -->
<GroupBox Header="Column 0"
Name="ds"
Margin="5,0,0,0"
Grid.Row="0"
Width="150"
Grid.Column="0"
Visibility="{Binding Path=IsChecked, ElementName=HideColumn0Button, Converter={StaticResource BoolToVisConverter}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
</StackPanel>
</Grid>
</GroupBox>
<!-- Column 1 -->
<GroupBox Header="Column 1"
Grid.Row="0"
Grid.Column="1"
Margin="5,0,0,0"
Visibility="{Binding Path=IsChecked, ElementName=HideColumn1Button, Converter={StaticResource BoolToVisConverter}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
</StackPanel>
</Grid>
</GroupBox>
<!-- Column 2 -->
<GroupBox Header="Column 2"
Grid.Row="0"
Margin="5,0,0,0"
Grid.Column="2"
Visibility="{Binding Path=IsChecked, ElementName=HideColumn2Button, Converter={StaticResource BoolToVisConverter}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
</StackPanel>
</Grid>
</GroupBox>
//Put the GridSplitters in Columns 1 and 2, HorizontalAlignment="Left".
<GridSplitter Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="5"/>
<GridSplitter Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="5"/>
</Grid>
</GroupBox>
</Grid>
</Window>