覆盖ScrollViewer和TextBox(在WPF中)后,滚动条的拇指不会根据TextBox的文本大小移动

覆盖ScrollViewer和TextBox(在WPF中)后,滚动条的拇指不会根据TextBox的文本大小移动,wpf,xaml,Wpf,Xaml,我已经覆盖了TextBox和ScrollViewer的默认模板。现在,当我在文本框中输入文本时,滚动条的拇指(垂直和水平)不会根据文本大小自动移动。下面是一个截图。 ScrollViewer和TextBox的替代模板为: <Style TargetType="{x:Type TextBox}"> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Prope

我已经覆盖了TextBox和ScrollViewer的默认模板。现在,当我在文本框中输入文本时,滚动条的拇指(垂直和水平)不会根据文本大小自动移动。下面是一个截图。

ScrollViewer和TextBox的替代模板为:

 <Style TargetType="{x:Type TextBox}">
        <Setter Property="SnapsToDevicePixels" Value="True" />
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="KeyboardNavigation.TabNavigation" Value="None" />
        <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        <Setter Property="VerticalScrollBarVisibility" Value="Visible"/>
        <Setter Property="HorizontalScrollBarVisibility" Value="Visible"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBoxBase}">
                    <Border Name="Border" BorderThickness="1" Background="Black" BorderBrush="#346BAF">
                        <ScrollViewer x:Name="PART_ContentHost" Style="{DynamicResource TextBoxScrollViewer}"/>
                    </Border> 
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="Border" Property="Background" Value="#222B35"/>
                            <Setter TargetName="Border" Property="BorderBrush"  Value="#696969"/>
                            <Setter Property="Foreground" Value="#464A51"/>
                        </Trigger>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter TargetName="Border" Property="BorderBrush"  Value="#00BFFF"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

 <Style TargetType="{x:Type ScrollViewer}">
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="HorizontalScrollBarVisibility" Value="Visible"/>
        <Setter Property="VerticalScrollBarVisibility" Value="Visible"/>
        <Setter Property="MaxHeight" Value="450"/>
        <Setter Property="MaxWidth" Value="450"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <ScrollContentPresenter Grid.Column="0"/>
                        <Border Grid.Row="0" Grid.Column="1" BorderBrush="#0080FF" BorderThickness="0,1,1,0">
                            <ScrollBar Name="PART_VerticalScrollBar" Value="{TemplateBinding VerticalOffset}" Maximum="{TemplateBinding ScrollableHeight}" ViewportSize="{TemplateBinding ViewportHeight}" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>
                        </Border>
                        <Border Grid.Row="1" Grid.Column="0" BorderBrush="#0080FF" BorderThickness="1,0,0,1">
                            <ScrollBar Name="PART_HorizontalScrollBar" Orientation="Horizontal"  Value="{TemplateBinding HorizontalOffset}" Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
                        </Border>
                        <Border Grid.Row="1" Grid.Column="1" BorderBrush="#0080FF" BorderThickness="0,0,1,1" Background="#2C446B"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


每当您向文本框添加内容时,请收听事件TextChanged。在此方法中,使用以下方法:TextBoxBase.ScrollToEnd()。这将始终将滚动条移动到文本的末尾。

这不是解决问题的好办法,但我建议在文本框样式中添加
。它将防止文本“逃逸”到控件的边界之外实际上我已经尝试过了。但我的要求是默认显示两个滚动条。TextWrapping将包装文本,而我的水平滚动条将不可见。这个问题也发生在垂直滚动条上,使用TextWrap无法解决。我已经考虑过这个方向,但我的限制是只添加XAML代码(不应该修改.cs文件)。还有一点我想强调的是,如果我没有过载ScrollViewer,这个问题是看不到的。如果您对如何仅使用XAML解决此问题有任何想法,请让我知道。尝试此方法。它有一个选项仅在XAML中实现此目的。谢谢你提起这个!!但这看起来更像是一种解决方法,而不是修复方法。我仍然不知道为什么在重载ScrollVewer后,文本框无法更新滚动条。另外,当VerticalScrollBarVisibility和HorizontalScrollBar visibility的值设置为默认值时,他们提供的解决方案也可以正常工作(以及UI外观)。在我的例子中,这个值是“可见的”。因为根据代码,他们正在旋转滚动条,这个问题对我来说似乎已经解决了,但我看到一些奇怪的UI行为。