【问题标题】:WPF listview/gridsplitter/scrollviewer resize problemWPF listview/gridsplitter/scrollviewer 调整大小问题
【发布时间】:2014-09-18 05:40:21
【问题描述】:

在此组合中,gridsplitter 将我的列表视图推到视野之外时,我遇到了问题。重现步骤:

  • 启动程序,将窗口拖大
  • 将红色拆分器一直向左拖动以最小化蓝色列
  • 加宽两个 ListView 列,直到它们超出视口并出现水平滚动
  • 再次将窗口大小拖小

对我来说,这会慢慢地将 ListView 推到 Window 之外。请注意,ScrollViewer 实际上随着 Window 的大小而减小,但速度不同,并且会慢慢消失。一旦滚动查看器开始滑出视图,拆分器就不能再使用了!

奇怪的是,如果我不首先最小化左侧面板,我不会得到这种行为!

有什么办法可以解决这个问题?

<Window x:Class="LayoutTest3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800" MinHeight="600" MinWidth="800" >
    <Window.Resources>
        <XmlDataProvider XPath="/Celebrities/Celebrity" x:Key="celebs">
            <x:XData>
                <Celebrities xmlns="">
                    <Celebrity Name="Jimmy">
                        <LastName>Page</LastName>
                    </Celebrity>
                    <Celebrity Name="Johnny">
                        <LastName>Depp</LastName>
                    </Celebrity>
                    <Celebrity Name="Britney">
                        <LastName>Spears</LastName>
                    </Celebrity>
                </Celebrities>
            </x:XData>
        </XmlDataProvider>

        <DataTemplate x:Key="NameTemplate">
            <TextBlock Text="{Binding XPath=@Name}" />
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MinWidth="100" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" MinWidth="400" />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0" Background="Blue" />
        <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Background="Red" />
        <Border Grid.Column="2" Background="Green">
            <ListView ItemsSource="{Binding Source={StaticResource celebs}}">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Header="Name" CellTemplate="{StaticResource NameTemplate}" Width="150" />
                            <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding XPath=LastName}" />
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
            </ListView>
        </Border>
    </Grid>
</Window>

【问题讨论】:

  • 我的回答有误,实际上保留了星号,Auto-Sized 列更改为具体值。另外我不知道如何处理这种行为,所以无论如何这都不是一个好的答案。但是你需要创建这个子网格吗?主网格中的另一列不适合右扩展器吗?
  • 已编辑问题以删除除基本要素以外的所有内容。
  • 我似乎无法重现这个,你的目标是什么版本的 WPF?
  • @CodeNaked:如果您查看底部,您应该能够看到滚动条是如何剪辑的,因为您调整大小时右滚动按钮会消失。

标签: wpf gridsplitter


【解决方案1】:

GridSplitter 和具有 MinWidth 的 Column 存在一个已知问题,GridSplitter 仍会调整 Grid 的大小而忽略 Column 的 MinWidth。结果是增长列的子级获得了实际可用的更多大小。但是考虑到 MinWidth 的 Grid 布局子级,因此您的 Shrinking 列仍保持在 MinWidth 但Growing Column 的子级超出了 GridSplitter 超出缩小列的 MinWidth 的大小。

我将在我的一个项目中找出我是如何解决这个问题的,我将发布代码。同时您可以尝试以下选项。

  1. 从 ColumnDefinition 中删除 MinWidth
  2. 将 MinWidth 添加到子级

事先知道你的 Grid 的最小尺寸应该是 500 + Splitter 的尺寸,你可以设置整个 Grid 的 MinWidth。

【讨论】:

  • 是的,我发现最终是 MinWidth 导致了问题。请也发布您的答案,以便我们有选择。谢谢!
【解决方案2】:

我是这样做的:

<Grid Name="container" SizeChanged="container_SizeChanged">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Name="rightPanel" Width="*" MinWidth="100"/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" Background="Red" Foreground="White">Test</TextBlock>
    <GridSplitter Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Right" Width="2" Height="Auto" ResizeDirection="Columns"/>
    <Border Grid.Column="1" Background="Green" Margin="0 0 0 0">
        <ListView ItemsSource="{Binding Source={StaticResource celebs}}">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Name" CellTemplate="{StaticResource NameTemplate}" Width="150" />
                        <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding XPath=LastName}" />
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
    </Border>
</Grid>

和后面的代码(糟糕!):

private void container_SizeChanged(object sender, SizeChangedEventArgs e)
{
    rightPanel.MaxWidth = container.ActualWidth - 150;
}

基本上你取出最小宽度并执行类似的计算以在另一个面板上设置 MaxWidth。

【讨论】:

    【解决方案3】:

    也许这会有所帮助,您始终必须为宽度/高度使用相同类型的单位,否则拆分器将无法正常工作。

     <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" MinWidth="150"/>
            <ColumnDefinition Width="4*" MinWidth="150"/>
        </Grid.ColumnDefinitions>
    
        <ListView Grid.Column="0" BorderBrush="#FF005BFF" Margin="0,0,5,0">
            <ListView.View>
                <GridView>
                    <GridViewColumn />
                </GridView>
            </ListView.View>
        </ListView>
    
        <GridSplitter Grid.Column="1" 
                      HorizontalAlignment="Left" VerticalAlignment="Stretch" 
                      Background="Black" 
                      ShowsPreview="true"
                      Width="2" />
    
        <ListView Grid.Column="1" BorderBrush="#FFFF5100" Margin="5,0,0,0">
            <ListView.View>
                <GridView>
                    <GridViewColumn />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
    

    【讨论】:

      猜你喜欢
      • 2016-10-03
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多