我试图在单击按钮时用Grid隐藏GridSplitter中的一列(该按钮将第三列中所有项目的可见性设置为折叠)。如果我不移动GridSplitter,它将正常工作,第三列消失,但是,如果我移动GridSplitter,内容将消失,但其他列不会调整大小以填充空白空间。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="25"/>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="a" Width="*"/>
        <ColumnDefinition x:Name="b" Width="3"/>
        <ColumnDefinition x:Name="c" Width="Auto" MaxWidth="600"/>
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Background="Green">
        <Image Source="te/Dante.png" Height="Auto" Margin="0,128,2,71"/>
    </Border>
    <Button Grid.Column="0" Grid.Row="0" Width="30" Height="30" Margin="0,10,10,0" HorizontalAlignment="Right" VerticalAlignment="Top" Click="Button_Click"></Button>
    <GridSplitter Width="5" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" ResizeDirection="Columns" HorizontalAlignment="Left" Background="White" BorderBrush="Black" BorderThickness="1,0" ResizeBehavior="PreviousAndCurrent"/>
    <WrapPanel x:Name="wpC" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" MinWidth="300" HorizontalAlignment="Stretch" Background="Aqua" Panel.ZIndex="-1"></WrapPanel>
</Grid>

这是我的问题(gif)的示例:

c# - WPF-移动GridSplitter时,列无法正确隐藏-LMLPHP

我怎么解决这个问题?可能会尊重MVVM模式。

最佳答案

问题很简单,您设置GridSplitter ResizeBehavior="PreviousAndCurrent",但是以前的网格列宽度为*,并且一旦移动拆分器,其宽度单位就会更改为绝对值(因此,更改3d列宽度时,将无法调整大小)。

只需设置GridSplitter ResizeBehavior="PreviousAndNext"即可解决问题。如果这样做,拆分器将修改3d列的宽度,但不应再触摸第一个。

顺便说一句,您可以使用ToggleButton(该IsChecked绑定(bind)到具有您要隐藏的内容的容器的Visibility上)来代替使​​用button和click事件,请参阅this answer。使用具有纯xaml View 的转换器比具有一些代码和x:Name的转换器更好的MVVM。

正确,您几乎没有布局问题,这是一个完整的解决方案:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Border Background="Green" />
    <ToggleButton x:Name="toggleButton"
                  Width="30"
                  Height="30"
                  Margin="0,10,10,0"
                  HorizontalAlignment="Right"
                  VerticalAlignment="Top" />
    <Grid Grid.Column="1"
          Visibility="{Binding IsChecked, ElementName=toggleButton, Converter={StaticResource BooleanToVisibilityConverter}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="300"
                              MinWidth="300"
                              MaxWidth="600" />
        </Grid.ColumnDefinitions>
        <GridSplitter Width="5"
                      ResizeBehavior="CurrentAndNext" />
        <WrapPanel Grid.Column="1"
                   Background="Aqua" />
    </Grid>
</Grid>

无需后台代码,从here获取转换器。

要点是:1)将拆分器放在可隐藏容器内2)设置网格列以包含*fixed width(将doesn't work well拆分为auto列)。

演示:

c# - WPF-移动GridSplitter时,列无法正确隐藏-LMLPHP

关于c# - WPF-移动GridSplitter时,列无法正确隐藏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37026029/

10-10 09:33