WPF:如何在DockPanel中拉伸中间孩子?

brg*_*rgn 38 c# wpf xaml textbox dockpanel

我将一个DockPanel添加到RadioButton元素,这样我就可以使用100%的宽度水平分配单选按钮标签,文本框和按钮.

LastChildFill="True"在DockPanel中使用会拉伸最后一个元素.如果文本框是面板中的最后一个子项,这很好用.但是,由于按钮是最后一个元素并且具有固定宽度,因此应该拉伸文本框.但是,没有像这样的财产2ndChildFill="True".

我的代码看起来像这样:

    <RadioButton HorizontalAlignment="Stretch"
                                        HorizontalContentAlignment="Stretch">
        <DockPanel >
            <TextBlock VerticalAlignment="Center">in location:</TextBlock>
            <TextBox Grid.Column="1" Margin="10,0,0,0">Path string</TextBox>
            <Button HorizontalAlignment="Right" 
                    Margin="10,0,0,0" Padding="3,0">...</Button>
        </DockPanel>
    </RadioButton>
Run Code Online (Sandbox Code Playgroud)

它给了我这个:

wpf截图

任何想法,提示解决这个问题?提前谢谢了...

max*_*max 54

您需要DockPanel.Dock为元素设置附加属性并保留TextBox为最后一个元素:

<RadioButton HorizontalAlignment="Stretch"
             HorizontalContentAlignment="Stretch">
    <DockPanel LastChildFill="True">
        <TextBlock DockPanel.Dock="Left"
                   VerticalAlignment="Center"
                   Text="in location:" />
        <Button DockPanel.Dock="Right"
                Margin="10,0,0,0"
                Padding="3,0"
                Content="..." />
        <TextBox Margin="10,0,0,0">
            Path string
        </TextBox>
    </DockPanel>
</RadioButton>
Run Code Online (Sandbox Code Playgroud)

  • 由于DockPanel.Dock属性,文本框仍将在中间呈现.将它移动到XML文档中的最后一个位置只会使WPF向控件授予父控件的完整剩余空间. (10认同)
  • 问题的标题提到'中间',答案将其移至'最后'.那为什么没有更好的答案? (4认同)
  • 我试过这个,但它搞砸了我的 taborder!由于 WPF 按 xaml 中的顺序分配默认选项卡索引,因此最好不要移动元素。 (2认同)
  • 澄清一下,“DockPanel”有一个属性“LastChildFill”,当设置为 true 时,将扩展最后一个元素以填充容器的其余部分。我认为默认值是“True”(但如果您愿意,您可以将其明确设置为 true)。 (2认同)

Paw*_*wel 6

接受的答案正在解决您的问题,但会产生另一个问题。如果有人使用键盘 ( TAB) 在您的界面中导航,Button则会在 之前获得焦点TextBox。从长远来看,这可能会非常烦人。如果您不想阻止 Tab 键顺序,请使用Grid以下命令DockPanel

<RadioButton HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" VerticalAlignment="Center">in location:</TextBlock>
        <TextBox Grid.Column="1" Margin="10,0,0,0">Path string</TextBox>
        <Button Grid.Column="2" HorizontalAlignment="Right" Margin="10,0,0,0" Padding="3,0">...</Button>
    </Grid>
</RadioButton>
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用TabIndex属性自己控制 Tab 键顺序。但这可能很棘手,尤其是当您在集合中显示控件时。

<RadioButton HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" TabIndex="0">
    <DockPanel LastChildFill="True">
        <TextBlock DockPanel.Dock="Left" VerticalAlignment="Center" Text="in location:" />
        <Button DockPanel.Dock="Right" Margin="10,0,0,0" Padding="3,0" Content="..." TabIndex="2"/>
        <TextBox Margin="10,0,0,0" TabIndex="1">Path string</TextBox>
    </DockPanel>
</RadioButton>
Run Code Online (Sandbox Code Playgroud)

  • 我同意,这是一个更好的方法。另一个答案并没有错,但这里的布局更直观,因为控件按照它们在 UI 上出现的顺序列出。谢谢。 (2认同)