wpf - TextBlock 包装属性不起作用

标签 wpf xaml

在下面的 XAML 中,我试图包装绑定(bind)到“PortfolioCodes”和“CommentaryText”的 TextBlock,但似乎“Wrapping”不适用于 TextBlock。我尝试了在这个网站上可以找到的所有可能的建议,但都是徒劳的。有人可以帮忙吗。

    <Grid>
    <ListBox ItemsSource="{Binding Path=Summaries}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border CornerRadius="5" BorderBrush="LightGray" BorderThickness="1" Padding="4" Margin="4">
                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                            <ColumnDefinition Width="15"></ColumnDefinition>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>
                        <TextBlock Grid.Column="0" Grid.Row="0">No Of Security</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="0" Text="{Binding Path=PortfolioSecurityCount}"></TextBlock>

                        <TextBlock Grid.Column="0" Grid.Row="1">Portfolio Code(s)</TextBlock>
                        <Grid Grid.Column="2" Grid.Row="1" >
                            <TextBlock TextWrapping="Wrap" Text="{Binding Path=PortfolioCodes}"></TextBlock>
                        </Grid>

                        <TextBlock Grid.Column="0" Grid.Row="2">Commentary Text</TextBlock>
                        <Grid Grid.Column="2" Grid.Row="2" >
                            <TextBlock Grid.Column="2" Grid.Row="2" TextWrapping="Wrap"  Text="{Binding Path=CommentaryText}"></TextBlock>
                        </Grid>
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

根据 Guge 的回复,我已将 xaml 更改如下,现在它可以正常工作了。
    <Grid x:Name="LayoutRoot">
    <ListBox x:Name="SummaryListBox" ItemsSource="{Binding Path=Summaries}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border CornerRadius="5" BorderBrush="LightGray" BorderThickness="1" Padding="4" Margin="4">
                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                            <ColumnDefinition Width="15"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>
                        <TextBlock Grid.Column="0" Grid.Row="0">No Of Security</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="0" Text="{Binding Path=PortfolioSecurityCount}"></TextBlock>

                        <TextBlock Grid.Column="0" Grid.Row="1">Portfolio Code(s)</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Path=PortfolioCodes}" ></TextBlock>

                        <TextBlock Grid.Column="0" Grid.Row="2">Commentary Text</TextBlock>
                        <TextBlock Grid.Column="2" Grid.Row="2" TextWrapping="Wrap"  Text="{Binding Path=CommentaryText}"></TextBlock>
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

最佳答案

将第三个 ColumnDefinition 的宽度从“Auto”更改为“*”,这样它只会占用水平空间的剩余部分。

试图解释这一点:
WPF 中的屏幕区域以两遍算法分布。首先,每个视觉元素都会询问每个 child 需要多少空间,并指出可用空间。这些 child 为他们的 child 做同样的事情。
然后每个视觉元素告诉每个 child 他们实际上将得到多少。这些 child 再次为他们的 child 做同样的事情。

您的代码未能执行您想要的操作,因为 DataTemplate 中的 Grid 告诉其第三列子项,他们可以在第一次运行时拥有他们想要的所有水平空间(“自动”)。那些文本框然后认为他们不必换行。所以他们只是报告了他们想要的宽度,以及一行的高度。
在第二次运行中,Grid 发现“auto”比那些 child 想要的要少一些。并且网格仍然只给了他们一行的高度,所以包装是不可能的。然后, children 别无选择,只能截断文本。

当第三列宽度设置为“*”时,网格将准确地告诉该列中的 child 在第一列获得“自动”并且第二列获得 15 之后还剩下多少水平像素。现在文本框可以弄清楚他们可能想要换行,然后他们报告说“好的,爸爸,我会用那些微不足道的水平像素,但至少给我我想要的垂直像素”。垂直空间没有限制,因此他们得到了展示他们所有精彩内容所需的一切。

关于wpf - TextBlock 包装属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5550673/

相关文章:

c# - 二次贝塞尔曲线 : Y coordinate for a given X?

xaml - Xamarin - HtmlWebViewSource 和 XAML

c# - Windows 10 中的 Monogame 鼠标仅在移动后感觉有压力

wpf - ContentPresenter.ContentSource与内容

c# - 公理或 WPF 3D?

wpf - 用于 WPF 的文件浏览器/文件选择器

c# - 用 MahApps.Metro 无边框窗口的菜单替换窗口标题

c# - 使用 WrapPanel 指定每行的项目数

wpf - Xaml中CollectionViewSource SortDescription的绑定(bind)PropertyName

wpf - MVVM - 如何显示 View ?