在一个窗口中,我有一个DockPanel
列表来指定几个文件。每个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"
来改变它,但这只会导致按钮再次变小,而不是使TextBox变宽(即使使用HorizontalAlignment="Stretch"
)。
我希望按顺序控制的原因是我希望用户在使用tab
在窗口中导航时到达Button之前的TextBox。我查看了设置TabIndex
但感觉很乱,WPF最喜欢的功能是tabindex按照XAML中定义的conrols的顺序。更不用说我可能不得不在Window中的所有内容上手动设置TabIndex。
对我来说,似乎不遵守TextBox.HorizontalAlignment的设置。 如何让第一个控件尽可能多地使用空间,但仍保留Tab键顺序?
答案 0 :(得分:39)
像这样:
<DockPanel LastChildFill="True">
<Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file -->
<TextBox DockPanel.Dock="Left" HorizontalAlignment="Stretch"/> <!-- path to file -->
</DockPanel>
答案 1 :(得分:27)
如果您不想使用DockPanel的行为,请不要使用DockPanel。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox />
<Button Content="..." Grid.Column="1"/>
</Grid>