WPF网格大小调整Auto vs Star

时间:2017-12-22 22:37:14

标签: wpf xaml

在我的XAML中,我有一定的水平空间。在其中我需要放一个文本(长度未知),然后是一个按钮。按钮应直接放在文本后面。我正在使用以下XAML:

<Border Name="Boundaries" MaxWidth="500" MinWidth="500" Height="20">
      <Grid>
         <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" TextTrimming="CharacterEllipsis">
                Lorem ipsum dolor sit amet, pri ex option legendos. Ludus solet at mel, facilisis urbanitas nam ad.
            </TextBlock>
         <Button Grid.Column="1">Button</Button>
     </Grid>
</Border>

当TextBlock中的文本很短时,一切正常,但是当文本足够长时,TextBlock将溢出父元素,按钮将不可见。为了解决这个问题,我可以将第一列定义的宽度设置为*,但这意味着按钮总是在右边(即使文本是单个单词,但我希望它紧跟在文本之后)。

过去我通过从父级的ActualSize设置转换器的第一列定义的MaxWidth来修复类似的问题,但是这非常复杂且非常不可靠。

似乎这样的基本布局要求将成为WPF的一部分,但我找不到任何东西。我错过了什么吗?

我想要这样的事情: enter image description here

2 个答案:

答案 0 :(得分:4)

您可以使用DockPanel来实现此目的。类似的东西:

<Border Name="Boundaries" MaxWidth="500" MinWidth="500" Height="20">
    <DockPanel HorizontalAlignment="Left" LastChildFill="False">
        <Button DockPanel.Dock="Right">Button</Button>
        <TextBlock DockPanel.Dock="Right" TextTrimming="CharacterEllipsis">
            Lorem ipsum dolor sit amet, pri ex option legendos. Ludus solet at mel, facilisis urbanitas nam ad.
        </TextBlock>
    </DockPanel>
</Border>

答案 1 :(得分:0)

要在不强制预定大小的情况下执行此操作,您需要使用列来获取布局大小,但不要将列用于实际布局。添加两列,然后在第一列中放置一个边框,您可以使用该边框来获取TextBlock的大小。在这个例子中,我将第二列的宽度绑定到按钮的宽度,这样如果你改变按钮文本它仍然可以工作。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="{Binding ElementName=mybutton, Path=ActualWidth}" />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0" Name="myborder"/>

        <StackPanel Orientation="Horizontal" Grid.ColumnSpan="2">
            <TextBlock MaxWidth="{Binding ElementName=myborder, Path=ActualWidth}" Text="test text" TextTrimming="CharacterEllipsis"/>
            <Button Name="mybutton" Content="button" />
        </StackPanel>
    </Grid>