4

我有一个TextBlock可能包含很长的文本,所以我想给它添加一个垂直滚动条。我最初的尝试是ScrollViewer环绕它。这行得通,但问题是当我放大时,宽度也被放大了。我尝试像这样禁用水平滚动条:

<ScrollViewer IsTabStop="True" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">

但这并没有解决问题。我也尝试绑定宽度:

Width="{Binding ElementName=Scroller, Path=ViewportWidth}"

它也没有帮助。

所以,我的问题是,如何向它添加垂直滚动条,但TextBlock内部有固定宽度和包装文本?这是我的完整代码:

<ScrollViewer Grid.Row="1" IsTabStop="True" VerticalScrollBarVisibility="Auto">
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Top"  TextWrapping="Wrap" TextAlignment="Center"/>
</ScrollViewer>
4

2 回答 2

4

这个答案有两个部分......首先是简单地使用 a TextBox

<TextBox ScrollViewer.VerticalScrollBarVisibility="Visible" Text="Something really 
    really really really really really really really really long" 
    Style="{StaticResource TextBlockStyle}" />

第二部分是简单StyleTextBox,使它看起来像一个TextBlock

<Style x:Key="TextBlockStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Background" Value="{x:Null}" />
    <Setter Property="BorderBrush" Value="{x:Null}" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Padding" Value="0" />
    <Setter Property="IsReadOnly" Value="True" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="TextWrapping" Value="Wrap" />
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
</Style>

如果这些属性不适合您的情况,请随意删除它们。

于 2013-09-11T13:44:28.537 回答
1
  <TextBox HorizontalAlignment="Center" 
    VerticalAlignment="Top" 
    TextWrapping="Wrap" 
    TextAlignment="Center" 
    VerticalScrollBarVisibility="Auto" Width="300" Style="{StaticResource TextBlockStyle}"/>

你不需要一个ScrollViewer包裹在 中TextBoxTextBox控件有它自己的ScrollViewer. 您需要定义的宽度,TextBox以便滚动条知道它的固定宽度并包裹文本。

然后,您必须将 TextBox 设置为看起来像TextBlock

根据来自MSDN的 Microsoft Ifeanyi Echeruo 的说法,这是为什么这ScrollViewer不起作用的一个很好的理由

ScrollViewer 首先询问它的内容在没有约束的情况下它希望有多大,如果内容需要的空间比 Viewer 的空间多,那么它有时间启动一些 ScrollBars

在没有约束的情况下,TextBlock 将始终选择返回所有文本适合单行的大小。

带有 ScrollBars 的 ScrollViewer 将永远无法包装 TextBlock。

但是,您可能能够为您自己的面板提出一个 Measure\Arrange 组合,这几乎就像 ScrollViewer 但我想不出任何可以满足这两个约束条件的逻辑,而无需明确了解所述孩子的行为

于 2013-09-11T13:43:22.727 回答