【问题标题】:Single-line TextBox overflow unscrollable单行文本框溢出不可滚动
【发布时间】:2016-03-02 01:47:02
【问题描述】:

不确定这是错误还是什么,但我的文本框都不允许水平滚动。我尝试了各种方法来解决,但还没有一个赢家。具体来说,我希望能够选择文本并左右拖动以显示溢出。

我首先删除了针对 TextBox 的所有样式。

然后我添加了一些属性,例如HorizontalScrollBarVisibility=Visible, VerticalScrollBarVisibility=Disabled, AcceptsReturn=False, TextWrapping=NoWrap...

到目前为止,添加上述任何属性都不起作用。

是否有我缺少的属性或我需要为此添加的事件处理程序?

编辑

忘了提一下,实际滚动条显示(水平),但它不允许您向左/向右拖动选定的文本。我刚刚删除了一个以 ScrollBar 为目标的样式,但这似乎并没有妨碍。

编辑 2

简单示例:

<TextBox
    Text="Lots of text to cause overflow"
    HorizontalScrollBarVisibility="Visible"
    VerticalScrollBarVisibility="Disabled"
    AcceptsReturn="False"
    TextWrapping="NoWrap"/>

编辑 3

问题源于我用于定位 ScrollViewer 的样式,但我不确定原因:

<Style TargetType="{x:Type ScrollViewer}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollViewer}">
                <Grid>
                    <ScrollContentPresenter Grid.Column="0" />
                    <ScrollBar x:Name="PART_VerticalScrollBar" HorizontalAlignment="Right" Value="{TemplateBinding VerticalOffset}" Maximum="{TemplateBinding ScrollableHeight}" ViewportSize="{TemplateBinding ViewportHeight}" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
                    <ScrollBar x:Name="PART_HorizontalScrollBar" Orientation="Horizontal" VerticalAlignment="Bottom" Value="{TemplateBinding HorizontalOffset}" Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
                    <!--<Rectangle Grid.Row="1" Grid.Column="1" Fill="Red"/>-->
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

编辑 4

按照小樱的建议,我有:

<ControlTemplate TargetType="{x:Type ScrollViewer}">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ScrollContentPresenter Grid.Row="0" Grid.Column="0"/>
        <ScrollBar Grid.Row="0" Grid.Column="1" x:Name="PART_VerticalScrollBar" HorizontalAlignment="Right" Value="{TemplateBinding VerticalOffset}" Maximum="{TemplateBinding ScrollableHeight}" ViewportSize="{TemplateBinding ViewportHeight}" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
        <ScrollBar Grid.Row="1" Grid.Column="0" x:Name="PART_HorizontalScrollBar" Orientation="Horizontal" VerticalAlignment="Bottom" Value="{TemplateBinding HorizontalOffset}" Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
    </Grid>
</ControlTemplate>

但是还是不行……

【问题讨论】:

  • 在原帖中添加了一个示例。
  • 您上面的代码不是真正的 XAML 代码。 TextBox 没有 TextWrap 属性。
  • 错字,应该是TextWrapping
  • 不能左右拖拽文字,但还是可以选择文字,对吧?
  • 我可以选择文本,但不能左右拖动选择来查看溢出。我基本上想在没有水平滚动条的情况下通过拖动选定的文本来水平滚动。

标签: c# wpf scroll textbox


【解决方案1】:

问题是ScrollViewer 为您的TextBox 自动设置样式。您可以通过在样式中将&lt;Grid&gt; 更改为&lt;Grid Background="Yellow"&gt; 来测试它。

您覆盖它但不要将CanContentScroll="True" 设置为ScrollContentPresenter

变化:

<ScrollContentPresenter Grid.Row="0" Grid.Column="0"/>

收件人:

<ScrollContentPresenter CanContentScroll="True"/>

【讨论】:

  • 那么如何修改 ScrollViewer 的样式,使其不切断溢出?我意识到我把这个样式放在那里的原因是因为我的样式针对 ScrollBar 会在 ScrollViewer 的右下角留下一个白色的完美形状的正方形,所以对它的需求是至关重要的。将所有这些作为目标可以避免手动将样式添加到每个样式的需要,鉴于我拥有的数量,这将是一种痛苦,必须经历和添加/管理。
  • @kill4silence 只需将 &lt;ScrollContentPresenter Grid.Row="0" Grid.Column="0"/&gt; 更改为 &lt;ScrollContentPresenter CanContentScroll="True"/&gt;
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2013-07-05
  • 2014-11-28
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多