WPF Dockpanel 第一个孩子使用剩余空间

Posted

技术标签:

【中文标题】WPF Dockpanel 第一个孩子使用剩余空间【英文标题】:WPF Dockpanel first child uses remaining space 【发布时间】:2011-04-10 07:49:50 【问题描述】:

在一个窗口中,我有一个DockPanels 列表来指定几个文件。每个 DockPanel 都有一个 TextBox(用于路径)和一个按钮(用于浏览文件)。

我重新创建了一个简单的 WPF 页面来演示这里的问题:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="150"
    Height="22">
    <DockPanel>
        <TextBox HorizontalAlignment="Stretch"/> <!-- path to file -->
        <Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file -->
    </DockPanel>
</Page>

问题是我想要文本框右侧的按钮,但这会导致文本框非常小,因为 DockPanel 的 LastChild 是它占用剩余空间的按钮。我试图通过随机播放它们并设置LastChildFill="False" 来改变这一点,但这只会导致按钮再次变小,而不会使文本框变宽(即使使用HorizontalAlignment="Stretch")。

我希望按该顺序控制控件的原因是,当使用tab 在窗口中导航时,我希望用户在 Button 之前到达 TextBox。我查看了设置TabIndex,但感觉很hacky,WPF最喜欢的功能是tabindex按照XAML中定义的控制顺序排列。更不用说我可能不得不在 Window 中的所有内容上手动设置 TabIndex。

对我来说,TextBox.Horizo​​ntalAlignment 的设置似乎没有得到尊重。 如何让第一个控件使用尽可能多的空间但仍保留 Tab 键顺序?

【问题讨论】:

【参考方案1】:

把它变成这样:

<DockPanel LastChildFill="True">
    <Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file -->
    <TextBox DockPanel.Dock="Left" HorizontalAlignment="Stretch"/> <!-- path to file -->
</DockPanel>

【讨论】:

太棒了!完全不直观且令人讨厌,但考虑到 DockPanel 的设计方式,它的工作方式就像一种魅力,并且有一种奇怪的感觉。好电话。 我已经看过好几次了。我主要担心的是 XAML 中元素的顺序不再与窗口的视觉布局相匹配。而且它搞乱了标签顺序。 我同意@ChristofferLette +1,但以防万一有人需要,这里是 taborder 问题的解决方法。这可能需要大量的手动工作,而且并不总是能很好地工作(例如使用 DataGrid):***.com/a/4808810/724944 不错!我正在解决类似的问题,但没有意识到子订单没有反映视觉订单,这解决了我的问题。 在基本情况下(一个拉伸的顶部区域和一个底部区域)执行此操作,并且选项卡顺序很好。也许问题只在特定条件下才会出现?【参考方案2】:

如果您不想要 DockPanel 的行为,请不要使用 DockPanel。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>

    <TextBox />
    <Button Content="..." Grid.Column="1"/>
</Grid>

【讨论】:

+1 因为它没有 TabOrder 问题。如果有人想避免在这种简单的场景中输入 ColumnDefinitions,请查看以下解决方案:rachel53461.wordpress.com/2011/09/17/…

以上是关于WPF Dockpanel 第一个孩子使用剩余空间的主要内容,如果未能解决你的问题,请参考以下文章

使 Scrollviewer 填充 DockPanel 中的可用空间

如何使 DockPanel 中的项目扩展以适应 WPF 中的所有可用空间?

WPF编程,我上层容器是dockpanel,里边想放3个canvas,但是实际的效果是后边的canvas会占满整个窗口,怎么办

wpf - 当其他列的内容折叠时,网格列不填充剩余空间

WPF 中的 StackPanel 和 DockPanel 有啥区别?

WPF教程四;布局之DockPanel面板