【问题标题】:WPF: How can I stretch the middle child in a DockPanel?WPF:如何在 DockPanel 中拉伸中间的孩子?
【发布时间】:2012-12-11 15:54:05
【问题描述】:

我向 RadioButton 元素添加了一个 DockPanel,这样我就可以使用 100% 的宽度水平分布单选按钮标签、一个文本框和一个按钮。

在 DockPanel 中使用 LastChildFill="True"with 可拉伸最后一个元素。如果文本框是面板中的最后一个子项,则效果很好。但是,由于按钮是最后一个元素并且具有固定宽度,因此应该拉伸文本框。但是,没有像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>

它给了我这个:

任何想法,提示来解决这个问题?非常感谢提前...

【问题讨论】:

  • 为什么不用网格来代替呢?具有 3 列的网格,第二列设置为 * 宽度,其他设置为自动
  • 是的,可以。但它在我看来有点过度设计。 DockPanel-Solution 会不会更优雅一点?它不需要所有这些列定义。

标签: c# wpf xaml textbox dockpanel


【解决方案1】:

您需要为您的元素设置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>

【讨论】:

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

接受的答案是解决您的问题,但会产生另一个问题。如果有人使用键盘 (TAB) 在您的界面中导航,Button 将在 TextBox 之前获得焦点。从长远来看,这可能非常烦人。如果您不想中断标签订单,请使用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>

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

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

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 2016-04-23
    • 2018-08-19
    • 2011-04-10
    • 2015-06-10
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多