首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF -当GridSplitter被移动时列没有正确隐藏

WPF -当GridSplitter被移动时列没有正确隐藏
EN

Stack Overflow用户
提问于 2016-05-04 11:06:56
回答 1查看 3.2K关注 0票数 14

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

代码语言:javascript
运行
复制
<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)的一个例子:

我该如何解决这个问题?可能是尊重MVVM模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-04 14:37:20

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

只需设置GridSplitter ResizeBehavior="PreviousAndNext"来解决问题。如果这样做,拆分器将修改三维列的宽度,但不应该再接触第一列。

顺便说一下,而不是使用按钮和单击事件,您可以使用ToggleButton ( IsChecked绑定到容器的Visibility,并包含您想要隐藏的内容),请参阅this answer。使用具有纯xaml视图的转换器比使用一些代码后面和x:Name的转换器更好。

对,您有几个布局问题,下面是一个完整的解决方案:

代码语言:javascript
运行
复制
<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 (带auto列的拆分器doesn't work well )。

演示:

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37026029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档