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