WPF如何决定如何呈现textblock textwrap?

时间:2013-11-21 16:28:25

标签: c# wpf xaml text textwrapping

我试图了解WPF在呈现启用换行的文本块时如何做出决定。

我有以下代码:

<Window x:Class="WpfWrapTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Width="200" Height="200">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" MinWidth="5"></ColumnDefinition>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Border Background="Yellow" Grid.Column="0"></Border>
    <GridSplitter ResizeDirection="Columns" Grid.Column="1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></GridSplitter>
    <Grid Grid.Column="2" MinWidth="40">
        <TextBlock  TextWrapping="Wrap">asdflk;jsadlkfjlaskdjflasdkjflk laskdjfl;askjd l;kasjdf l;kjsadf ;lkajsdfl k</TextBlock>
    </Grid>
</Grid>

启动WPF时决定使我的文本块大于屏幕,而不考虑包装

然后当我拖动网格探测器时它会做出不同的决定(可能是因为网格探测器正在设置邻居控制的宽度?)

此示例中的第三个奇怪行为是当您尝试向左拖动格栅放大器时(第1列的最小宽度为5)。然后它决定重新放大可视屏幕空间之外的文本块。

是什么让WPF做一个或另一个?

3 个答案:

答案 0 :(得分:1)

尝试将第3列设置为"*""Auto"意味着TextBlock将使用所需的空间,实际上意味着它不需要包装。

拖动拆分器时,您为网格列指定了一个显式大小,因此TextBlock将换行以适合该大小。

答案 1 :(得分:0)

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MinWidth="5"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Border Background="Yellow" Grid.Column="0"></Border>
        <GridSplitter ResizeDirection="Columns" Grid.Column="1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></GridSplitter>
        <Grid Grid.Column="2" MinWidth="40">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock  TextWrapping="Wrap">asdflk;jsadlkfjlaskdjflasdkjflk laskdjfl;askjd l;kasjdf l;kjsadf ;lkajsdfl k</TextBlock>
        </Grid>
    </Grid>
</Window>

答案 2 :(得分:0)

它非常简单......甚至可能对答案来说太简单了。

如果TextBlockTextBlock的父级Width的{​​{1}}值超过TextBlock.Text,则文本将被包装。否则,它将不被包裹。

真的很简单。至于另一个奇怪的&#39;你谈到的症状,我在那里真的无法帮助你......你的代码并没有告诉我他们。例如,我不确定如何拖动GridSplitter 更多左侧