2

我在让网格、分离器和扩展器的排列正常工作时遇到问题,尤其是在设置最小高度方面。我已经遵循了这里发布的一些建议(特别是关于如何组合拆分器和扩展器),并且已经使基本架构正常工作,但我无法让最终细节正常工作。我确信我可以通过反复试验得到一些工作,特别是如果我在代码隐藏中做一些蛮力工作,但我猜有一些关于 WPF 调整大小如何工作的基本原则,我是在这里失踪。

以下 xaml 是实际结构的简化版本,为清楚起见添加了颜色和边框。我已经取消了设置 MinHeights 的尝试。(目前没有代码隐藏。)

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Width="450"
  Height="600">
  <Grid Background="Yellow">
    <Grid.RowDefinitions>
         <RowDefinition Height="*" />
         <RowDefinition Height="Auto"/>
         <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <TextBox x:Name="Tree" Grid.Row="0" Text="Tree" BorderThickness="2" BorderBrush="Red" />

    <Expander IsExpanded="True" Grid.Row="1" Header="Expand/Collapse Details" ExpandDirection="Down"
          BorderThickness="2" BorderBrush="Black" VerticalAlignment="Bottom">
      <Expander.Content>
        <Grid x:Name="LowerAreaGrid" Margin="4">
         <Grid.RowDefinitions>
             <RowDefinition Height="*"/>
             <RowDefinition Height="Auto"/>
          </Grid.RowDefinitions>

          <GridSplitter HorizontalAlignment="Stretch" Grid.Row="0" Height="8" Background="DarkGray"
                        ResizeDirection="Rows" ResizeBehavior="CurrentAndNext" />

          <Grid x:Name="DetailsPaneAndSubpane" Margin="4" Grid.Row="1">
            <Grid.RowDefinitions>
               <RowDefinition Height="*" MaxHeight="{Binding ActualHeight, ElementName=DetailsPane}"/>
               <RowDefinition Height="Auto" />
               <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

              <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.Row="0">

                <TextBox x:Name="DetailsPane" Text="This is the Details Pane. It is 150 pixels high. If the available space is too small, it will grow a scrollbar to see all the content." 
                    TextWrapping="Wrap" BorderThickness="4" BorderBrush="Green" Height="150"/>
              </ScrollViewer>  

              <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" Height="8" Background="Brown"
                            ResizeDirection="Rows" ResizeBehavior="PreviousAndNext" />

              <Border BorderThickness="4" Grid.Row="2" BorderBrush="Blue">    
                <Grid x:Name="SubpaneAndButtons" Margin="4" Grid.Row="1">
                  <Grid.RowDefinitions>
                     <RowDefinition Height="*" />
                     <RowDefinition Height="Auto"/>
                  </Grid.RowDefinitions>

                  <TextBox Grid.Row="0" Text="This is the Details Subpane. It can grow and shrink."
                             BorderThickness="2" BorderBrush="Blue"/>

                  <Grid x:Name="SubpaneButtons" Grid.Row="1" Background="Blue" Margin="4">
                      <Button Width="200">Do something with subpane</Button>
                  </Grid>
                </Grid>
              </Border>
           </Grid>

        </Grid>
      </Expander.Content>
    </Expander>

    <Grid x:Name="CommandButtons" Grid.Row="2" Background="Pink" Margin="4">
        <Button Width="200">Do something with whole window</Button>
    </Grid>

  </Grid>
</Page>

如您所见,窗口有两个主要区域。There is a tree in the top pane, and when an item in the tree is selected, the bottom area (which is contained in an expander) shows details about the item. 有一个分离器可以改变顶部和底部区域的相对大小。详细信息区域进一步分为两部分:具有固定最大尺寸的详细信息窗格和可以扩大和缩小的底部详细信息子窗格。第二个拆分器控制详细信息窗格和详细信息子窗格的相对大小。

窗口底部还有一个按钮,表示一组按钮,这些按钮是适用于整个窗口的命令。详细信息子窗格底部有一个按钮,表示一组按钮,这些按钮是仅适用于详细信息子窗格的命令。

这是不起作用的:

  1. 问题:第二个(棕色)分离器最初无法向上移动。(预计不能向下移动,因为详细信息窗格处于其最大尺寸。)您必须稍微移动灰色拆分器,然后棕色拆分器工作正常,即使您将灰色拆分器移回它的位置曾是。

  2. 树的 MinHeight 应该为 75。问题:将它放在树的 RowDefinition 中会导致当您将滑块向上拖动超过 75 像素标记时,其余内容会滑出窗口的末端。(如果您没有 MinHeight,则在将拆分器向上拖过窗口顶部时会发生这种滑动。)

  3. 详细信息窗格和详细信息子窗格的 MinHeight 应为 50。问题:向下移动任何一个拆分器都会将这些区域压扁。

  4. 两个拆分器都不应影响“使用子窗格执行操作”按钮行。它应该始终完全可见,除非展开器折叠。问题:再一次,向下移动任何一个分离器都会将该区域压扁。

这是有效的方法,并且在进行所有更改后应该继续工作:

  1. 当“展开/折叠详细信息”展开器折叠时,它会折叠除“对整个窗口执行操作”按钮行之外的所有内容。树占用了所有剩余空间。

  2. 详细信息窗格是固定大小(150 像素)。它不能长得比这更大,如果给它的空间比这小,它会长出一个滚动条,让整个 150 像素仍然可以看到。

需要进行哪些更改(在 xaml 或代码隐藏中)才能使其正常工作?

4

0 回答 0