在WPF的TextBlock中缩进文本

3

我正在使用一个列表框来展示撤销/重做列表,数据模板如下:

<ListBox x:Name="actionList"
           Height="150"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Stretch"
           MouseMove="ListBoxMouseMove"
           ScrollViewer.VerticalScrollBarVisibility="Visible"
           SelectionMode="Extended"
           Style="{StaticResource CustomListBoxStyle}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <TextBlock Width="235"
                   HorizontalAlignment="Stretch"
                   VerticalAlignment="Stretch"
                   FontSize="11"
                   Text="{Binding DisplayText}"
                   TextWrapping="Wrap" />
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>

功能符合预期,但对于较长的撤销重做字符串,换行会发生,但它与行的第一个字符对齐。我们希望稍微缩进以清楚地识别两个列表项。如下所示:

期望的换行功能

我们如何实现相同效果。


据我所知,这不容易实现。你需要找出字符串中哪一部分是在新行并将该部分缩进到“RichTextBox”内。这会引起无数的头痛。也许这里需要进行设计更改?或者你可以为文本提供填充,这样你列表中的项目就会彼此间隔更远。同时,“padding for the text”可译为“文本填充”。 - Mike Eason
1个回答

2

更简便的方法可能涉及使用段落对象来表示文本。

段落原生支持缩进,例如通过TextIndent(控制首行缩进,您可以将其设置为负值)或Margin(为整个段落设置边距,但尊重首行缩进)等属性。

<ListBox.ItemTemplate>
    <DataTemplate>
        // IsHitTestVisible is set to false to avoid FlowDocument's built-in text selection
        //     from disrupting the regular ListBox mouse selection behavior
        <Grid IsHitTestVisible="False">
            <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Disabled"
                                      ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                 <FlowDocument FontSize="12"
                               FontFamily="Calibri" 
                               Foreground="Black" 
                               PagePadding="0">
                     <Paragraph TextIndent="-10" 
                                Margin="10,0,0,0">
                         <Run Text="{Binding ., Mode=OneWay}" />
                     </Paragraph>
                 </FlowDocument>
            </FlowDocumentScrollViewer>
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>

我们如何将段落作为列表框项目放置? - Mohit Vashistha
编辑了我的答案并附上了代码示例,同时删除了BindableRun的内容,因为自4.0版本以来,Run确实是可绑定的(示例使用ListView而不是ListBox,但你可以看到这个想法:P) - almulo
它确实能工作,但失去了列表框的功能和样式。我无法展示选定的项目,并且对其进行样式设置太过繁琐。 - Mohit Vashistha
我明白了... 它适用于 ListView,但我刚刚检查了一下 ListBox,就像你说的那样。我成功地使用 IsHitTestVisible="False" 将其按预期工作,因此我会编辑我的答案,以防其他人发现它有用。 - almulo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接