12

我有一个 TextBlock,其中包含一长行要换行的文本。我已将 TextBlock 放置在 ViewBox 中,希望文本大小在仍然换行时会发生变化,但这似乎没有发生。ViewBox 只是调整 TextBox 的大小,以便所有文本都适合一行,从而使文本非常小。

如何在仍使用 TextWrapping 的同时使用 ViewBox 调整文本大小。

这是我的代码:

<Viewbox>
    <TextBlock Text="The Option text can also dynamically grow/shrink to fit more content. More text to go here....................." TextWrapping="Wrap"/>
</Viewbox>

这是 Windows 8 商店应用程序的一部分,WinRT Xaml 也是如此。

4

3 回答 3

27

只需在TextBlock.

        <Viewbox Width="500">
            <TextBlock Width="100" TextWrapping="Wrap">This is the text that's long and on two lines.</TextBlock>
        </Viewbox>

宽度为 500 的 ViewBox 中宽度为 100 的 TextBlock

因此ViewBox将放大/缩小其全部内容。如果您不通过在 上设置宽度来限制其内容TextBlockViewBox则会为其提供无限的空间来扩展。您还可以在其中添加一个Grid具有宽度和高度的根,ViewBox并将您的元素放在其中,然后整个地块将根据ViewBox.

在图像中,TextBlock100 的宽度被缩放ViewBox为 500 的宽度。因此,要获得所需的包装,只需调整TextBlock宽度直到看起来不错。

(显然应该说三行,但我不会为此重新上传)

于 2013-07-18T20:02:06.583 回答
2

我有同样的问题,我有很多按钮,我需要一个 ViewBox 来处理本地化。这样做的原因是Width设置为Infinity,因为按钮或控件的宽度是由父控件决定的。幸运的是,控件有一个名为 ActualWidth 的属性。此属性包含渲染宽度,我可以在绑定中使用它:

<Button>
    <Button.Content>
        <Viewbox StretchDirection="DownOnly">
            <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Button}}" TextWrapping="Wrap" TextAlignment="Center" Text="{Binding }" />
        </Viewbox>
    </Button.Content>
</Button>

因此文本块获取 Button 按钮当前具有的宽度。如果按钮改变宽度,它会自动更新。文本块将根据给定的宽度进行换行,并且仅在必要时才会收缩(如果应用了 StretchDirection="DownOnly")。

https://docs.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.actualwidth?view=netframework-4.8

于 2019-12-03T09:34:01.263 回答
0

您不必固定任何控件的宽度或最大值。使用虚拟网格并绑定到其 ActualWidth。见代码https://github.com/omeraziz/NoTextOverflowWPF

<Window Title="NoTextOverflow"
    x:Class="NoTextOverflow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="Auto" Height="Auto"
    ResizeMode="CanResize" SizeToContent="WidthAndHeight">

<!--
    There is no fixed width in any of the UI elements including window, Label, TextBlock, TextBox etc.
    Window's SizeToContent grows and shrinks with the contents.
-->

<Grid Margin="10" ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Label VerticalAlignment="Center" Content="Type Here:" />
    <TextBox x:Name="LongText"
             Grid.Column="1" Grid.ColumnSpan="2"
             Width="{Binding ElementName=WidthRestrictorGrid, Path=ActualWidth, Mode=OneWay}"
             MinWidth="100"
             Margin="5" HorizontalAlignment="Left" VerticalAlignment="Center"
             Text="Type here a long message and resize this window" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" />

    <!--
        This grid is used to calculate width of middle two columns.
        Remove this and its references to see the effect without this grid.
        Since this is not parent of TextBox and TextBlock so it must have a Name to bind with its Actualwidth
    -->

    <Grid x:Name="WidthRestrictorGrid"
          Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2"
          Margin="10,1" HorizontalAlignment="Stretch" />

    <TextBlock Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"
               Width="{Binding ElementName=WidthRestrictorGrid, Path=ActualWidth, Mode=OneWay}"
               MinWidth="50"
               Margin="5" HorizontalAlignment="Left" VerticalAlignment="Top"
               Background="LightGray"
               Text="{Binding ElementName=LongText, Path=Text}"
               TextWrapping="Wrap" />

    <Button Grid.Row="2" Grid.Column="3"
            Margin="5" HorizontalAlignment="Right" VerticalAlignment="Bottom"
            Content="Dummy" />

</Grid>
于 2021-07-07T08:49:19.473 回答