在我的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的一部分,但我找不到任何东西。我错过了什么吗?
答案 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>