单行TextBox溢出不可滚动

时间:2016-03-02 01:47:02

标签: c# wpf scroll textbox

不确定这是一个bug还是什么,但我的TextBox都不允许水平滚动。我已经尝试了各种方法来解决,但没有什么是胜利者。具体来说,我希望能够选择文本并向左/向右拖动以显示溢出。

我首先开始删除任何针对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"/>

example

编辑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

根据Sakura的建议,我有:

<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>

但它还没有用......

1 个答案:

答案 0 :(得分:1)

问题是为ScrollViewer自动设置TextBox样式。您可以通过样式更改<Grid><Grid Background="Yellow">来测试它。

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

变化:

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

要:

<ScrollContentPresenter CanContentScroll="True"/>