我从MSDN(link)复制了ScrollViewer
模板,它打破了文本框行为。当我使用鼠标选择文本时,滚动现在不遵循选择。为什么?如何解决?
这是我的代码
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525">
<Window.Resources>
<Style TargetType="{x:Type ScrollViewer}">
<Setter Property="OverridesDefaultStyle"
Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border Grid.Column="1"
BorderThickness="0,1,1,1">
<Border.BorderBrush>
<SolidColorBrush Color="{DynamicResource BorderMediumColor}" />
</Border.BorderBrush>
<ScrollContentPresenter />
</Border>
<ScrollBar x:Name="PART_VerticalScrollBar"
Value="{TemplateBinding VerticalOffset}"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
<ScrollBar x:Name="PART_HorizontalScrollBar"
Orientation="Horizontal"
Grid.Row="1"
Grid.Column="1"
Value="{TemplateBinding HorizontalOffset}"
Maximum="{TemplateBinding ScrollableWidth}"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Margin="20"
Width="100"
Text="sdjkfhsdjkfhjkdshxcmvnm,xcnv,mxcnv, mxcnv,mxcngjklsdjkfh jkdfghjkfhgjkdfhgkjdfghkjdfhgbkjcvhbkcvjbh" />
</StackPanel>
</Window>
我使用.NET 4
答案 0 :(得分:2)
我有同样的问题,我最终通过向ScrollContentPresenter添加CanContenScroll =“True”来解决。
<ScrollContentPresenter Grid.Column="0" CanContentScroll="True"/>
如果你想让它更灵活,只需将它绑定到祖先值:
<ScrollContentPresenter Grid.Column="0"
CanContentScroll="{TemplateBinding CanContentScroll}" />
希望有所帮助
答案 1 :(得分:0)
是的,我得到了同样的行为。我担心我无法弄清楚它为什么会发生,它可能是WPF中的一个错误,也可能是他们定义控制模板的方式。
TextBox的控件模板有一个滚动查看器作为其布局的一部分,显然模板以某种方式干扰了它。
我可以做的唯一建议是你给你的样式一个x:Key值,并且只在你需要它的特定情况下在ScrollViewer元素上引用该样式,而不是将它应用于所有ScrollViewers。然后,TextBox的元素树中包含的ScrollViewer将不会拾取它。有点痛苦,你失去了WPF模板的动态性,但它应该有用。
答案 2 :(得分:0)
您的样式正在定位ScrollViewer
中类型为Window
的 ALL 控件,因为该样式没有设置键(x:Key
)-这是一个由于TextBox
实际上在其模板中使用了ScrollViewer
。
尝试使用<Style x:Key="MyScrollViewerStyle" TargetType="{x:Type ScrollViewer}">
。然后,您可以像这样在ScrollViewer
上引用此样式:<ScrollViewer Style="{StaticResource MyScrollViewerStyle}">