【问题标题】:Making middle component widen up over the remaining space in dock panel使中间组件在停靠面板中的剩余空间上加宽
【发布时间】:2015-11-26 15:19:32
【问题描述】:

停靠面板具有最后一个停靠控件分配所有剩余空间的属性。这会产生以下效果:ping-ping-ping-piiiing,缺乏真实的视觉表现。

我想实现这样的情况,即最顶部和最底部的控件被挤压,剩余空间分配给中间控件(或者根本没有,因为窗口的中间应该是空的,并且视觉上引人注目的控件将仅放置在边缘)。创建的效果将是:ping-ping-piiiing-ping。

想象一下,窗口顶部有所有标签、框等(停靠在面板顶部),底部有一堆按钮(停靠在面板底部并水平放置)右对齐),类似于消息框。

我怎样才能做到这一点?也许停靠面板需要与其他布局器结合使用?或者也许我应该完全使用不同的布局?在多年前的 Swing 中,有这个北/南/东/西容器。

【问题讨论】:

    标签: wpf xaml layout panel layout-manager


    【解决方案1】:

    如果你想让最后一个元素成为“中间”元素并占用剩余空间,你可以设置这个布局:

    <DockPanel LastChildFill="True">
    
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
          Labels, boxes
        </StackPanel>
    
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">
          Buttons here
        </StackPanel>
    
        <Label></Label>        
    
    </DockPanel>
    

    这就是你的意思?请注意,最后一个元素(空标签)没有停靠。 如果“最后一个子项”代表一些可扩展的 UI 控件(或一组控件),例如 ListBox,通常会使用这种方法。


    替代方案:

    为了您的目标,您还可以设置一个三行表格,并将中间行所有剩余高度:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />            
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Label Grid.Row="0">Top row</Label>
        <Label Grid.Row="2">Bottom row</Label>        
    </Grid>
    

    【讨论】:

    • 哦,我理解这种方法。它确实有效,但我不禁觉得这是一种变通方法,而不是真正的解决方案。其原因是类似 XML 的标记不应该依赖于它的顺序。兄弟姐妹是兄弟姐妹。至少在纯理论中,呵呵。
    • 是的,在这种情况下,顺序很重要。我猜 WPF 设计团队的唯一替代方案是包含子控件的名称 (x:key),它将填充 DockPanel 属性中的空间(这意味着您必须命名此元素)。
    • 在我看来,这更不符合 XMLishness。是否有另一个不太知名的面板或布局管理器,它最后自动添加了一个空控件以启用该行为,而无需我自己做?
    • 我使用三行表格布局作为替代更新了答案。
    • 为了彻底和一个简洁的例子+1。
    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2021-02-05
    • 2017-05-29
    • 2018-11-29
    相关资源
    最近更新 更多