【问题标题】:How does WPF decide how to render the textblock textwrap?WPF 如何决定如何呈现 textblock textwrap?
【发布时间】:2013-11-21 16:28:24
【问题描述】:

我试图弄清楚 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 时决定让我的文本块大于屏幕并且不考虑这一点来进行换行

然后,当我拖动 gridsplitter 时,它会以某种方式做出不同的决定(可能是因为 gridsplitter 正在设置相邻控件的宽度?)

此示例中的第三个奇怪行为是,当您尝试将 gridsplitter 向左拖动时超出其所能移动的位置(第 1 列的最小宽度为 5)。然后它决定在可视屏幕空间之外重新放大文本块。

是什么让 WPF 做其中之一?

【问题讨论】:

    标签: c# wpf xaml text word-wrap


    【解决方案1】:

    尝试将第三列设置为 "*"。 "Auto" 表示TextBlock 将使用所需的空间,实际上意味着它不需要换行。

    当您拖动拆分器时,您为网格列指定了一个明确的大小,因此 TextBlock 将自动换行以适应该大小。

    【讨论】:

      【解决方案2】:
      <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>
      

      【讨论】:

        【解决方案3】:

        真的很简单……可能太简单了,甚至无法回答。

        如果TextBlock 或TextBlock 的父级被赋予Width,而TextBlock.Text 的值比TextBlock.Text 长,则文本将被换行。否则不会被包裹。

        真的就是这么简单。至于您所说的其他“奇怪”症状,我真的无法帮助您……您的代码没有向我显示它们。例如,我不确定如何将GridSplitter 拖到比它可以去的地方多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多