XAML TextBlock:如何使TextBlock具有可变高度?

发布于 2024-12-09 20:42:18 字数 1008 浏览 0 评论 0原文

我有一个包含 TextBlock 的列表框。

有时 TextBlock 的内容太长,我希望该条目的高度根据需要增加一倍或三倍以容纳文本。

我尝试了 TextWrapping="Wrap" 但它不起作用。每个 TextBlock 的高度仍然只有一行。

有没有一种简单的方法可以解决 XAML 中的问题?谢谢。

*附加信息:我试图简化问题,但也许完整的场景更好。

  1. 我有一个列表框,其条目根据下面代码中的模板显示。
  2. 每个条目都有 2 条信息:产品价格和产品名称。
  3. 我不想在列表框中使用水平滚动条,并且希望产品名称在必要时显示在 2 行或更多行中。产品名称为 2nd TextBlock。

这是我的 XAML:

<ListBox Name="listBox1" ItemsSource="{Binding}" Margin="10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock MinWidth="40"  TextAlignment="Right" Text = "{Binding ProductPrice}" />


                    <TextBlock Text = "{Binding ProductName}" TextWrapping="Wrap" />

                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>

I have a ListBox that contains TextBlocks.

Sometimes the content of a TextBlock is too long and I want the height of this entry to double or triple as needed to accommodate the text.

I tried TextWrapping="Wrap" but it doesn't work. Every TextBlock is still just one line in height.

Is there an easy way to fix the problem in XAML? Thanks.

* Additional info: I tried to simplify the question but perhaps the complete scenario is better.

  1. I have a listbox whose entries are displayed according to a template in code below.
  2. Each entry has 2 pieces of info: a product price followed by product name.
  3. I don't want to use the horizontal scrollbar in the listbox and want the product name to be displayed in 2 or more lines if necessary. The product name is the 2nd TextBlock.

Here's my XAML:

<ListBox Name="listBox1" ItemsSource="{Binding}" Margin="10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock MinWidth="40"  TextAlignment="Right" Text = "{Binding ProductPrice}" />


                    <TextBlock Text = "{Binding ProductName}" TextWrapping="Wrap" />

                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小糖芽 2024-12-16 20:42:18

禁用列表框水平scrollViewer。这样 textBlock 将被强制换行。

XAML:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
      <TextBlock TextWrapping="Wrap"/>
</ListBox>

示例结果:

在此处输入图像描述

编辑:

从您添加的 XAML 中,我是确信问题出在 StackPanel 上。
尝试用 Grid 替换它,例如:

    <ListBox Name="listBox1" ItemsSource="{Binding}" Margin="10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBox.ItemTemplate>
                <DataTemplate>
                   <Grid>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="*"/>
                         <ColumnDefinition Width="*"/>
                     </Grid.ColumnDefinitions>
                        <TextBlock MinWidth="40"  TextAlignment="Right" Text = "{Binding ProductPrice}" />


                        <TextBlock Grid.Column="1" Text = "{Binding ProductName}" TextWrapping="Wrap" />

                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListBox>

StackPanel 不限制内容大小,因此 textBlock 不知道空间在哪里结束,并且包装不会发生。

Disable the listbox horizontal scrollViewer. This way the textBlock will be forced to wrap.

XAML:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
      <TextBlock TextWrapping="Wrap"/>
</ListBox>

Example result:

enter image description here

Edit:

From the XAML you added I'm confident that the problem lays in the StackPanel.
Try replacing it with Grid for example:

    <ListBox Name="listBox1" ItemsSource="{Binding}" Margin="10" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBox.ItemTemplate>
                <DataTemplate>
                   <Grid>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="*"/>
                         <ColumnDefinition Width="*"/>
                     </Grid.ColumnDefinitions>
                        <TextBlock MinWidth="40"  TextAlignment="Right" Text = "{Binding ProductPrice}" />


                        <TextBlock Grid.Column="1" Text = "{Binding ProductName}" TextWrapping="Wrap" />

                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListBox>

StackPanel doesn't limit the content size, therefore the textBlock doesn't knows where the space ends , and the wrapping doesn't happens.

打小就很酷 2024-12-16 20:42:18

您正在使用StackPanel。尝试使用DockPanel

<DockPanel>
 <TextBlock  DockPanel.Dock="Left" MinWidth ="40"  TextAlignment="Right" Text = "11.12" />
 <TextBlock Text = "{Binding LongText}" DockPanel.Dock="Right" TextWrapping="Wrap" />
</DockPanel>

例如:

在此处输入图像描述

You are using StackPanel. Try using DockPanel:

<DockPanel>
 <TextBlock  DockPanel.Dock="Left" MinWidth ="40"  TextAlignment="Right" Text = "11.12" />
 <TextBlock Text = "{Binding LongText}" DockPanel.Dock="Right" TextWrapping="Wrap" />
</DockPanel>

For Example:

enter image description here

软的没边 2024-12-16 20:42:18

这会帮助你做到这一点。不要调整 TextBlock 的大小,只需调整滚动查看器的大小,因为 texblock 需要可变,因此 ScrollViewer 一旦超过 的大小,就会应用 Scrollbar >ScrollViewer

<ScrollViewer HorizontalScrollBarVisibility="Auto" 
     VerticalScrollBarVisibility="Auto">
  <TextBlock/>
 </ScrollViewer>

对于列表框项目

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.Items>
            <TextBlock Text="{Binding LongText}" TextWrapping="Wrap"/>
        </ListBox.Items>
    </ListBox>

this will help you do that. Dont Size the TextBlock just size the scroll viewer because texblock needs to be variable so ScrollViewer will apply Scrollbar once it goes beyond the size of ScrollViewer .

<ScrollViewer HorizontalScrollBarVisibility="Auto" 
     VerticalScrollBarVisibility="Auto">
  <TextBlock/>
 </ScrollViewer>

For ListBoxItem

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.Items>
            <TextBlock Text="{Binding LongText}" TextWrapping="Wrap"/>
        </ListBox.Items>
    </ListBox>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文