【问题标题】:TextBlock with vertical scrollbar only仅带有垂直滚动条的 TextBlock
【发布时间】:2013-09-11 13:31:18
【问题描述】:

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

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

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

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

也没有用。

所以,我的问题是,我怎样才能在其中添加垂直滚动条,但要为 TextBlock 里面的 TextBlock 添加固定宽度和换行文本?这是我的完整代码:

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

【问题讨论】:

  • 你是如何“放大”的?你的scrollviewer 周围有viewbox 吗?
  • 没有。我只是 Ctrl+Scroll 进行缩放。我没有ViewBox

标签: wpf xaml windows-runtime


【解决方案1】:

这个答案有两个部分......第一部分是简单地使用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>

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

【讨论】:

  • 谢谢。我将控件更改为TextBox
【解决方案2】:
  <TextBox HorizontalAlignment="Center" 
    VerticalAlignment="Top" 
    TextWrapping="Wrap" 
    TextAlignment="Center" 
    VerticalScrollBarVisibility="Auto" Width="300" Style="{StaticResource TextBlockStyle}"/>

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

然后,您必须设置 TextBox 的样式,使其看起来像 TextBlock

根据来自 Microsoft 的 Ifeanyi Echeruo(来自 MSDN)的说法,ScrollViewer 不起作用的一个很好的理由

ScrollViewer 首先询问它的内容想要多大 没有约束,如果内容需要更多的空间 然后查看器有时间启动一些滚动条

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

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

但是您可以想出一个 Measure\Arrange 组合 对于您自己的面板,它几乎就像 ScrollViewer 但我不能 想想任何可以满足这两个约束的逻辑,而无需明确 了解上述儿童的行为

【讨论】:

  • -1 因为您的答案有很多错误。你的代码是TextBlock,但你的描述是TextBox。此外,TextBlock 类中没有 VerticalScrollBarVisibility 属性...也许您正在考虑 ScrollViewer.VerticalScrollBarVisibility 附加属性?不过,这似乎不适用于TextBlock
  • 我的错,应该是文本框。应该很明显,我的解释提到了TextBox而不是TextBlock,我在复制他的代码时犯了一个错误。
猜你喜欢
  • 2015-07-01
  • 2010-11-14
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多