【问题标题】:How to get TextBlock to Wrap or scroll inside FlowDocumentScrollViewer如何让 TextBlock 在 FlowDocumentScrollViewer 内换行或滚动
【发布时间】:2011-09-18 01:00:51
【问题描述】:

我在 4 行 x 2 列网格中有以下 XAML。 Grid.ColumnDefinitions 的 ColumnDefinition Width 都设置为 *。

    <FlowDocumentScrollViewer Style="{StaticResource myFlowDoc}"
                              Grid.Row="4"
                              Grid.Column="1"  >
        <FlowDocument >
            <Paragraph  LineHeight="12" >
                <ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}" />
                <TextBlock TextWrapping="Wrap" Text="{Binding /, Mode=OneWay}" />
            </Paragraph>
        </FlowDocument>
    </FlowDocumentScrollViewer>

数据来自 ObservaleCollection 并且看起来很好并且可以正确垂直滚动。但是,当一个项目不能水平放入 TextBlock 时,文本块将不会换行并且 FlowDocumentScrollViewer 将不会显示滚动条。查看文本的唯一方法是水平扩展窗口。有谁知道我做错了什么以及为什么 TextWrapping 设置不被尊重?

如果这里重要的是样式 myFlowDoc

        <Style x:Key="myFlowDoc">
        <Setter Property="Control.Padding"
                Value="0" />
        <Setter Property="FlowDocumentScrollViewer.IsToolBarVisible"
                Value="True" />
        <Setter Property="Control.MinHeight"
                Value="150" />
        <Setter Property="Control.BorderBrush"
                Value="SteelBlue" />
        <Setter Property="Control.BorderThickness"
                Value="2" />
        <Setter Property="Control.VerticalAlignment"
                Value="Stretch" />
    </Style>

[编辑 1] 这是带有应该换行的错误消息的全屏。在此图像下方,我有一个仅显示消息详细信息区域,窗口较宽,因此您可以看到整个消息。我还将用户控件的整个 xaml 放在https://gist.github.com/1036178#

[编辑 2.1] @Navid 的建议让我间接得到了答案。删除“/”并将内容包装在数据模板中似乎可以解决问题。这是新的 XAML

<DataTemplate x:Key="StringCollection">
   <TextBlock TextWrapping="Wrap" Text="{Binding}" TextAlignment="Left"/>
</DataTemplate>
<!--... now down in the ItemsControl-->
<ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}"
          ItemTemplate="{StaticResource StringCollection}" />

【问题讨论】:

  • 我看不出有什么问题可以发截图吗?
  • 我不确定感知屏幕截图的最佳方式是什么,所以我只是编辑了原始帖子,我用“正常”宽度的窗口拍摄了一张照片,然后是详细信息之一我已将窗口设置得足够宽以便您可以看到整个消息的区域。我还提供了一个完整的 xaml 文件的链接。
  • 你能描述一下&lt;ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}" /&gt; &lt;TextBlock TextWrapping="Wrap" Text="{Binding /, Mode=OneWay}" /&gt;

标签: wpf flowdocument textblock flowdocumentscrollviewer


【解决方案1】:

您可以使用ListView as 来引入滚动条

<Section Name="Gallery">
                <Paragraph>
                    <ListView ItemsSource="{Binding GalleryCards}"
                              BorderBrush="Transparent"
                              HorizontalAlignment="Center"
                              ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                              Padding="10"
                              Width="{Binding ElementName=Viewer, Path=RenderSize.Width, Converter={StaticResource DocumentSizeConverter}, ConverterParameter=80, UpdateSourceTrigger=PropertyChanged}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ContentControl s:View.Model="{Binding .}"/>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                        <ListView.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel HorizontalAlignment="Center" />
                            </ItemsPanelTemplate>
                        </ListView.ItemsPanel>
                    </ListView>
                </Paragraph>
            </Section>

【讨论】:

    【解决方案2】:

    使用这个

    <ItemsControl ItemsSource="{Binding ReceivedData, Mode=OneWay}">     
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{Binding /, Mode=OneWay}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    【讨论】:

    • 我刚刚尝试过,但不幸的是,我收到“使用 ItemsSource 之前项目集合必须为空”。应用程序 OnStartup 覆盖中的 InvalidOperationException 权限。也就是说,调用堆栈只显示 OnStartup 调用,并且在 window.Show() 上抛出错误。我会环顾四周,看看是否能发现更多关于导致此异常的原因。
    • OK - 在你,SO 和 Pro WPF n C# 2008 之间,我想通了。我不能将 TextBlock 直接放在 ItemsControl 中,因为这与 ItemsSource 想要控制内容的事实相冲突。但是,我可以在其中放置一个 DataTemplate 并成功了。我会将修改后的代码放在原始问题中。 A 1K 谢谢你让我看到了光。
    • 原来它只是 OneWay 绑定语法。我回到我的原始代码并删除了“/,Mode = OneWay”,现在它可以工作了。这种带有斜线的奇怪语法是我唯一可以使用 Mode 值的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多