gpt4 book ai didi

wpf - TextBlock 包装属性不起作用

转载 作者:行者123 更新时间:2023-12-04 00:01:50 29 4
gpt4 key购买 nike

在下面的 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com