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

时间:2010-09-09 15:14:00

标签: wpf xaml dockpanel

在一个窗口中,我有一个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.Horizo​​ntalAlignment的设置。 如何让第一个控件尽可能多地使用空间,但仍保留Tab键顺序?

2 个答案:

答案 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>