WPF GridSplitter问题--两侧都缩小

8

Gridsplitter问题:

我有一个包含4列的网格

  • 第0列包含一个包含3列的网格
  • 第1列包含一个网格分隔器
  • 第2列包含宽度为20像素的stackpanel
  • 第3列包含一个包含3列的网格

当网格分隔器向左或向右移动时,两个面板都会以相同的量缩小 - 应该是一个收缩,另一个扩大。

我不确定是否需要包含xaml代码,但您可能会要求它,因此这里是一个简化版本。我仅删除了一些无关的控件,并清空了树形视图和列表视图。如果您真的需要完整的代码,则当然可以提供它。

感谢任何帮助!

<Window x:Class="Calvin.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="Calvin" >
    <DockPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="True" >
        <Grid DockPanel.Dock="Top" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RenderTransformOrigin="0.5,0.497" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="5"  />
                <ColumnDefinition Width="20"  />
                <ColumnDefinition Width="1*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*" />
                    <ColumnDefinition Width="5" />
                    <ColumnDefinition Width="2*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <TextBox Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"  TextWrapping="NoWrap" Text="Field One"  HorizontalAlignment="Stretch"/>
                <TextBox Grid.Row="0" Grid.Column="4" Grid.ColumnSpan="3"  TextWrapping="NoWrap" Text="Field Two"  HorizontalAlignment="Stretch" />
                <TreeView DockPanel.Dock="Left" Grid.Column="0" Grid.Row="1" Name="PaneOneTree" 
                          Width="Auto"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
                </TreeView>
                <GridSplitter Grid.Column="1" Grid.Row="1" Width="5" HorizontalAlignment="Center"/>
                <ScrollViewer Grid.Column="2" Grid.Row="1" >
                    <ListView DockPanel.Dock="Left" Name="FileDetailsLeft" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" >
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Header="Name" Width="120"  />
                                <GridViewColumn Header="Size" Width="120"  />
                                <GridViewColumn Header="Access Time" Width="120"  />
                                <GridViewColumn Header="Extension" Width="120"  />
                            </GridView>
                        </ListView.View>
                    </ListView>
                </ScrollViewer>
            </Grid>
            <GridSplitter Grid.Column="1" Grid.Row="0" Width="5" HorizontalAlignment="Left" />
            <StackPanel Grid.Column="2" Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Center" Width="Auto" Background="Red">
                <Button  >Move</Button>
                <Button >Other</Button>
            </StackPanel>
            <Grid Grid.Column="3" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="5" />
                    <ColumnDefinition Width="auto" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <TextBox Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"  TextWrapping="NoWrap" Background="Cornsilk"
                         Text="Pane Two Text"  HorizontalAlignment="Stretch"/>
                <TextBox Grid.Row="0" Grid.Column="4" Grid.ColumnSpan="3"  TextWrapping="NoWrap"
                         Text="Pane Two Text"  HorizontalAlignment="Stretch" Background="Linen" />
                <TreeView DockPanel.Dock="Left" Grid.Column="0" Grid.Row="1" Name="PaneTwoTree" Width="Auto"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                          Background="SeaShell" >
                </TreeView>
                <GridSplitter Grid.Column="1" Grid.Row="1" Width="5" HorizontalAlignment="Center" />
                <ScrollViewer Grid.Column="2" Grid.Row="1" >
                    <ListView DockPanel.Dock="Left" Name="FileDetailsRight" 
                              HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Background="Moccasin" >
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Header="Name" Width="120"  />
                                <GridViewColumn Header="Size" Width="120"  />
                                <GridViewColumn Header="Access Time" Width="120"  />
                                <GridViewColumn Header="Extension" Width="120"  />
                            </GridView>
                        </ListView.View>
                        <ListViewItem >List Item</ListViewItem>
                        <ListViewItem >List Item</ListViewItem>
                        <ListViewItem >List Item</ListViewItem>
                        <ListViewItem >List Item</ListViewItem>
                        <ListViewItem >List Item</ListViewItem>
                        <ListViewItem >List Item</ListViewItem>
                        <ListViewItem >List Item</ListViewItem>
                    </ListView>
                </ScrollViewer>
            </Grid>
        </Grid>
    </DockPanel>
</Window>

当然,如果您有更好的做法,请随时提出:) -- 我还在学习中。

:bp:


-1 您的问题在您提供的代码示例中无法重现,即使花费了很长时间删除了所有未包含在内的代码引用。如果您编辑您的代码示例并提供一个完整但简洁的可工作示例来展示您的问题,我将很乐意取消我的负投票。首先,您可以删除所有的Binding,只需设置HeightWidth以模拟具有数据的控件的大小。 - Sheridan
谢谢 - 我已经更新了XAML代码,以演示问题所在的项目。感谢任何帮助。 - Billy Pilgrim
你做了吗?我不认为你已经完成了... 你测试一下在这里输入的代码了吗?我不认为你有,因为我可以看到它甚至无法立即编译。请再试一次,并确保你可以将其加载到空项目中。 - Sheridan
已经进行了测试,但是格式化删除了其中的一部分——如何以及为什么会这样还是个谜。现在看起来已经完整了。 - Billy Pilgrim
+1 哦,成功了!现在我可以为您查看。 - Sheridan
2个回答

37

我遇到了相同的问题。当我移动一个GridSplitter时,它也会移动另一个(通常是相反的方向)。最终我发现,我忘记设置GridSplitter的一个属性。对于GridSplitter,您必须同时设置垂直和水平属性,例如 ...

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <GridSplitter Grid.Column="1" Width="2" 
        VerticalAlignment="Stretch" HorizontalAlignment="Center"/>
</Grid>

哇!谢谢你。我已经苦苦挣扎了很长时间。 - Commodore63

0

好的,我现在明白你的问题了...基本上,你不能在一个由GridSplitter控件更改宽度的列上设置精确的Width。相反,你只能在ColumnDefinition上设置MinWidth和/或MaxWidth属性,但要注意,你就不能使用"*"符号了。此外,从下面的代码示例中可以看出,你可以为你的问题示例剥离更多的代码...这是演示你的问题所需的全部内容(在我修复之前):

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" MinWidth="150" />
        <ColumnDefinition Width="5" />
        <ColumnDefinition Width="20" />
        <ColumnDefinition Width="*" MinWidth="150" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Rectangle Grid.Column="0" Fill="PowderBlue" />
    <GridSplitter Grid.Column="1" Background="Black" HorizontalAlignment="Stretch" />
    <Rectangle Grid.Column="2" Fill="Red" Height="100" />
    <Rectangle Grid.Column="3" Fill="Purple" />
</Grid>

"*"符号只有在同时设置了“VerticalAlignment”和“HorizontalAlignment”时才能正常工作;否则,您只能以像素为单位设置默认宽度。 - ReflexiveCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接