WPF Dockpanel 第一个孩子使用剩余空间
Posted
技术标签:
【中文标题】WPF Dockpanel 第一个孩子使用剩余空间【英文标题】:WPF Dockpanel first child uses remaining space 【发布时间】:2011-04-10 07:49:50 【问题描述】:在一个窗口中,我有一个DockPanel
s 列表来指定几个文件。每个 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.HorizontalAlignment 的设置似乎没有得到尊重。 如何让第一个控件使用尽可能多的空间但仍保留 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会占满整个窗口,怎么办