WPF / XAML两个标签的布局包含不同长度的文本,同时保持相同大小的字体缩放

时间:2012-04-25 08:03:07

标签: wpf xaml fonts scaling

我尝试定位两个标签,一个紧挨着另一个标签(间距很小)。

e.g。

标签1标签2

每个标签的内容总是不同的,大多数情况下,标签2会有更多的字符,但我希望在调整窗口大小时缩放内容,我希望标签1和标签2中的字体大小保持一致。 / p>

我不在乎标签2的内容是否被裁剪太长时间。

我尝试使用带有两列的网格并将Label放在ViewBox中:

<Viewbox Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
    <Label Margin="0,0,0,0" Content="{Binding Path=Suburb}"/>
</Viewbox>

问题是,定位永远不对,字体大小不会保持一致。

实现这一目标的最佳布局方法是什么?我可以通过绑定同步字体大小吗?我已经尝试将Label 2的FontSize属性绑定到Label 1的FontSize,但这并不起作用,因为无论字体真实多大/多小,它每次都会返回12(I&I #39; m假设实际的FontSize没有被计算,因为Label在ViewBox中。)

有什么建议吗?

由于

4 个答案:

答案 0 :(得分:2)

您可以使用以下方法:

<Viewbox VerticalAlignment="Top">
  <DockPanel>
    <TextBlock Text="Second" DockPanel.Dock="Right" />
    <TextBlock Text="First" />
  </DockPanel>
</Viewbox>

请注意,第二个标签永远不会被裁剪,因为Viewbox会允许内容呈现为任意大小,然后进行缩放。您可以在第二个MaxWidth上指定TextBlock,这会限制其大小(以像素为单位)。

您可以使用DockPanel代替Grid而不是ColumnDefinitions来实现相同的效果。

重要的是,它们都在同一个Viewbox中(因此,它不会同步FontSize,但会对其中包含的所有内容进行可视缩放。)

答案 1 :(得分:0)

以下标记似乎没问题:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Viewbox>
        <Label Content="Label 1" Width="{Binding ActualWidth, ElementName=label2}"/>
    </Viewbox>
    <Viewbox Grid.Column="1">
        <Label Name="label2" Content="Label 2 Label 2 Label 2"/>
    </Viewbox>
</Grid>

答案 2 :(得分:0)

我不是100%确定“窗口调整大小时内容比例”和“字体大小保持一致”的实际意思,但我想你希望每个标签都根据可用空间进行修剪。

那么为什么不使用TextBlock如下

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <TextBlock Text="{Binding Path=Suburb}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Margin="0,0,5,0" />
    <TextBlock Text="{Binding Path=Area}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Grid.Column="1"/>
</Grid>

答案 3 :(得分:0)

我意识到这个问题已经过时了,但更正确的方法之一就是使用运行

运行是TextBlock中的文本部分。

<TextBlock Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
    <Run Text="{Binding Suburb}" />
    <Run Text="{Binding Area}" />
</TextBlock>

请记住,TextBlock中的所有内容都是空格敏感的,所以如果你想让两个Runs背靠背运行而中间没有任何空格,你可以这样做:

<TextBlock Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">
    <Run Text="Foo" /><Run Text="bar" />
    <!-- Prints 'Foobar' -->
</TextBlock>

它类似于HTML的呈现方式,如果标记之间有空格,则在这些元素之间的页面上呈现单个空格。此规则仅适用于 文本块中的项目,而不适用于整个XAML页面。