如何包装自定义文本



我有一个使用datatemplate的列表框,模板中的一个元素是textblock。问题是这些字不会自动换行,而我不想设置固定的大小。有人知道怎么解决这个问题吗?快把我逼疯了!

                   <ListBox Grid.Row=" 1" HorizontalContentAlignment="Stretch" Background="#24221f" ItemsSource="{Binding Messages}" ScrollViewer.VerticalScrollBarVisibility="Visible" ClipToBounds="False" BorderBrush="{x:Null}">
                <ListBox.ItemTemplate>
                    <DataTemplate >
                        <Border BorderBrush="#24221f" BorderThickness="3" Width=" auto">
                            <DockPanel Background="{StaticResource blackBackground}" HorizontalAlignment="Stretch" Width="auto">
                                <Border BorderThickness="3" BorderBrush="Transparent">
                            <Image Source="{Binding IconImageUrl}" VerticalAlignment="top" Height="22" Width ="22" DockPanel.Dock="Left" />
                                </Border>
                                <Border BorderThickness="3" BorderBrush="LightGray" Height="auto" Width="auto" HorizontalAlignment="Left" VerticalAlignment="Center" DockPanel.Dock="Left">
                            <Image Source="{Binding ProfileImageUrl}" VerticalAlignment="Top" HorizontalAlignment="Left" Height="48" Width ="48"  />
                                </Border>
                                <StackPanel Orientation="Vertical" DockPanel.Dock="Left" Margin="5,0,0,0">
                                    <Label Content="{Binding Path=Sender}" Foreground="#feb41c" FontFamily="Verdana" FontWeight="Bold" FontSize="14" />
                                    <TextBlock Width="100" Text="{Binding Path=ShortMessage}" Margin="10,0,0,0" Foreground="BlanchedAlmond" TextWrapping="Wrap" FontFamily="Verdana" />
                                    <Label Content="{Binding Path=Time}" Margin="10,0,0,0" Foreground="DarkGray" FontFamily="Verdana" FontStyle="Italic"/>
                            </StackPanel>
                        </DockPanel>
                        </Border>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

StackPanel是Evil:=)当我在xaml中有奇怪的行为,其中包括StackPanel,切换到具有正确参数的网格(固定大小,或星星或"Auto")通常可以解决问题。还请注意,由于设置了DockPanel, xaml中出现了一个错误。你的第一个图像(IconImageUrl)的Dock,而它是在边界,围绕着它,你应该设置它。这可能会让布局做一些奇怪的事情。

尝试使用Style

将ListBoxItems的HorizontalContentAlignment属性设置为"Stretch"
 <Style TargetType="{x:Type ListBoxItem}" >
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
 </Style>

和禁用HorizontalScrollBar可见性

ScrollViewer.HorizontalScrollBarVisibility="Disabled" 

  <Window.Resources>
    <SolidColorBrush x:Key="blackBackground" Color="Black"/>
    <Style TargetType="{x:Type ListBoxItem}" >
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</Window.Resources>
<Grid>
    <ListBox Grid.Row=" 1" HorizontalContentAlignment="Stretch" Background="#24221f"  ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
             ItemsSource="{Binding Messages}" ScrollViewer.VerticalScrollBarVisibility="Visible" ClipToBounds="False" BorderBrush="{x:Null}">
        <ListBox.ItemTemplate>
            <DataTemplate >
                <Border BorderBrush="#24221f" BorderThickness="3" Width=" auto">
                    <DockPanel Background="{StaticResource blackBackground}" HorizontalAlignment="Stretch" Width="auto">
                        <Border BorderThickness="3" BorderBrush="Transparent">
                            <Image Source="{Binding IconImageUrl}" VerticalAlignment="top" Height="22" Width ="22" DockPanel.Dock="Left" />
                        </Border>
                        <Border BorderThickness="3" BorderBrush="LightGray" Height="auto" Width="auto" HorizontalAlignment="Left" VerticalAlignment="Center" DockPanel.Dock="Left">
                            <Image Source="{Binding ProfileImageUrl}" VerticalAlignment="Top" HorizontalAlignment="Left" Height="48" Width ="48"  />
                        </Border>
                        <StackPanel Orientation="Vertical" DockPanel.Dock="Left" Margin="5,0,0,0">
                            <Label Content="{Binding Path=Sender}" Foreground="#feb41c" FontFamily="Verdana" FontWeight="Bold" FontSize="14" />
                            <TextBlock  Text="{Binding Path=ShortMessage}" Margin="10,0,0,0" Foreground="BlanchedAlmond" TextWrapping="Wrap" FontFamily="Verdana" />
                            <Label Content="{Binding Path=Time}" Margin="10,0,0,0" Foreground="DarkGray" FontFamily="Verdana" FontStyle="Italic"/>
                        </StackPanel>
                    </DockPanel>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

我认为这个线程的答案是你的问题,看到接受的答案由"纳什" -强制TextBlock包装在WPF ListBox

(如果对你有帮助的话,记得在链接的帖子里给答案投票:))

最新更新