【问题标题】:How can I wrap a custom text?如何包装自定义文本?
【发布时间】:2019-04-20 00:42:52
【问题描述】:

我有一个使用数据模板的列表框,模板中的元素之一是文本块。问题是单词不会换行,我不想设置固定大小。有谁知道如何解决这个问题?快把我逼疯了!

                   <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>

【问题讨论】:

    标签: wpf text listbox


    【解决方案1】:

    StackPanel 是邪恶的 :=) 当我在包括 StackPanel 在内的 xaml 中有奇怪的行为时,切换到具有正确参数(固定大小、星号或“自动”)的网格通常可以解决问题。 另请注意,您的 xaml 中存在错误,因为您设置了第一个图像 (IconImageUrl) 的 DockPanel.Dock,而它位于它周围的边框中,您应该设置它。这可能会让 Layout 做一些奇怪的事情。

    【讨论】:

    • +1,StackPanel 不好的原因是它总是给它的孩子们要求的任何高度/宽度。在这种情况下,它认为TextBlocks 需要空间来显示全文,因此不会发生换行。
    【解决方案2】:

    只需尝试使用 StyleContentAlignment 属性来“拉伸”ListBoxItems

     <Style TargetType="{x:Type ListBoxItem}" >
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
     </Style>
    

    同时禁用 Horizo​​ntalScrollBar 的可见性

    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>
    

    【讨论】:

      【解决方案3】:

      我认为这个线程的答案是你的问题,请参阅“Nash”的接受答案 - Force TextBlock to wrap in WPF ListBox

      (如果对您有帮助,请记住对链接主题的答案进行投票:))

      【讨论】:

        猜你喜欢
        • 2018-02-28
        • 1970-01-01
        • 2016-12-16
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多