【问题标题】:Why TextWrapping for the TextBlock in the Grid works only if I specify TexBlock Width?为什么网格中 TextBlock 的 TextWrapping 仅在我指定 TexBlock Width 时才有效?
【发布时间】:2016-12-09 21:35:56
【问题描述】:

为什么网格中 TextBlock 的 TextWrapping 仅在我指定 TexBlock Width 时才有效?

当我删除 TextBlock MaxWidth 属性时,TextWrapping 不起作用。

组合框的完整代码

<Window Height="600" Width="480">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="4*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition></RowDefinition>
          <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <ComboBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding MyList}" SelectedIndex="0" x:Name="comboBox" HorizontalAlignment="Stretch" VerticalAlignment="Top">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Margin="2" Text="{Binding Code}"></TextBlock>
                        <TextBlock Margin="2" Text="{Binding Name}"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
            <ComboBox.ItemContainerStyle>
                <Style TargetType="ComboBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid ShowGridLines="False">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition MaxWidth="50"/>
                                        <ColumnDefinition Name="Column1"  MaxWidth="300"/>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Grid.Column="0" Text="{Binding Code}"/>
                                    <TextBlock Grid.Column="1" MaxWidth="{Binding ElementName=Column1, Path=MaxWidth}" Text="{Binding Name}" TextWrapping="Wrap"/>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ComboBox.ItemContainerStyle>
        </ComboBox>
    </Grid>
</Window>

【问题讨论】:

  • 请提供您问题的完整可重现样本。例如 Grid 的父元素是什么?
  • 我为组合框添加了完整代码。
  • 您还应该包括 ComboBox 的所有父元素,一直到父窗口。请提供任何人都可以按原样运行的最小示例。
  • 更新了我的帖子

标签: wpf xaml


【解决方案1】:

原因是通过将 ColumnDefinition 定义为 Auto*not setting it at all 您没有什么可以限制 TextBlock 可以使用的大小。因此,文本不换行是预期的行为。因此,您必须直接在 ColumnDefinition 或 TextBlock 上定义 Width 或 MaxWidth 才能使换行起作用。

【讨论】:

  • 我为 ColumnDefinition 定义了 MaxWidth,但 TextWrapp 不起作用。仅当我为 TextBlock 定义 MaxWidth 时它才有效。为什么?
  • 不指定列宽会导致文本框数据溢出列。相反,您可以尝试为列和文本框提供固定宽度。实际上,需要强制指定文本框 maxwidth 才能进行换行。否则在输入文本时其宽度会自动增加。
【解决方案2】:

为什么仅当我指定 TexBlock Width 时,Grid 中 TextBlock 的 TextWrapping 才有效?

因为当 ComboBox 打开时 Grid 被添加到不可见的 ScrollViewer 中。您可以解决此问题并通过简单地将 ComboBox 的 ScrollViewer.Horizo​​ntalScrollBarVisibility 附加属性设置为 Disabled 来换行:

<ComboBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding MyList}"
              SelectedIndex="0" x:Name="comboBox" HorizontalAlignment="Stretch"
              VerticalAlignment="Top" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="2" Text="{Binding Code}"></TextBlock>
                    <TextBlock Margin="2" Text="{Binding Name}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
        <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Width="100" />
            </ItemsPanelTemplate>
        </ComboBox.ItemsPanel>
        <ComboBox.ItemContainerStyle>
            <Style TargetType="ComboBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Grid ShowGridLines="False">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition MaxWidth="50"/>
                                    <ColumnDefinition MaxWidth="300"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Grid.Column="0" Text="Code..."/>
                                <TextBlock Grid.Column="1"
                                           Text="some long text some long text some long text some long text some long text" 
                                           TextWrapping="Wrap"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ComboBox.ItemContainerStyle>
  </ComboBox>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-26
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多