Wpf XAML ScrollViewer控件模板中的微小更改无效
我已经创建了一个基本的Windows桌面WPF应用程序。在主窗口中,我添加了以下内容作为窗口主体:Wpf XAML ScrollViewer控件模板中的微小更改无效,wpf,xaml,Wpf,Xaml,我已经创建了一个基本的Windows桌面WPF应用程序。在主窗口中,我添加了以下内容作为窗口主体: <ScrollViewer Template="{DynamicResource ScrollViewerControlTemplate1}"> <ScrollViewer.Resources> <ControlTemplate x:Key="ScrollViewerControlTemplate1" TargetTyp
<ScrollViewer Template="{DynamicResource ScrollViewerControlTemplate1}">
<ScrollViewer.Resources>
<ControlTemplate x:Key="ScrollViewerControlTemplate1" TargetType="{x:Type ScrollViewer}">
<Grid x:Name="Grid" Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Rectangle x:Name="Corner" Grid.Column="1" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Grid.Row="1"/>
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="0" Margin="{TemplateBinding Padding}" Grid.Row="0"/>
<ScrollBar x:Name="PART_VerticalScrollBar" AutomationProperties.AutomationId="VerticalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}" SmallChange="40000"/>
<ScrollBar x:Name="PART_HorizontalScrollBar" AutomationProperties.AutomationId="HorizontalScrollBar" Cursor="Arrow" Grid.Column="0" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
</Grid>
</ControlTemplate>
</ScrollViewer.Resources>
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="300"/>
<RowDefinition Height="300"/>
<RowDefinition Height="300"/>
<RowDefinition Height="300"/>
<RowDefinition Height="300"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Background="SteelBlue"/>
<Border Grid.Row="1" Background="Peru"/>
<Border Grid.Row="2" Background="Goldenrod"/>
<Border Grid.Row="3" Background="Tomato"/>
<Border Grid.Row="4" Background="IndianRed"/>
</Grid>
</ScrollViewer>
您会注意到,在垂直滚动条上,我设置了SmallChange=“40000”(一个任意大的数字)。然而,当我单击滚动条上的向上/向下箭头时,它会做与我将小更改设置为任何内容之前相同的非常小的更改
我已经阅读了很多次文档,不明白为什么这对ScrollViewer的滚动量没有任何影响。有什么想法吗
请注意,我可以更改ScrollBar模板并将这些按钮调用的命令更改为ScrollBar.PageUpCommand,而不是ScrollBar.LineUpCommand,但最终我希望对滚动的控制比整个页面更好。我怀疑您的自定义控件模板没有被使用,因为您引用它的方式。我将XAML更改为:
<ScrollViewer>
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid ...>
...
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
... ScrollViewer content goes here
</ScrollViewer>
...
... ScrollViewer内容位于此处
基本上,直接设置控件的模板,而不是使用动态资源。原因是在
ScrollViewer
和ScrollBar
中实现了一种特殊的逻辑
如果滚动条是独立的,ScrollBar.SmallChange
属性将仅用于滚动。这意味着,当它位于滚动查看器
之外时
如果查看ScrollViewer.OnApplyTemplate,您会注意到以下几点:
public override void OnApplyTemplate()
{
// ...
ScrollBar scrollBar = GetTemplateChild(HorizontalScrollBarTemplateName) as ScrollBar;
if (scrollBar != null)
scrollBar.IsStandalone = false;
// Same for the vertical scroll bar
// ...
}
如果ScrollViewer
在其内部找到滚动条,它会将其IsStandlone
(internal
)属性设置为false
,从而禁用滚动条的滚动命令处理。相反,ScrollViewer
接管了scroll命令的处理,但它忽略了一些ScrollBar
的属性,包括SmallChange
属性
TL;DR这对ScrollViewer
中的滚动条不起作用。您可以更改模板,以便使用两个“外部”滚动条。但是,您需要手动将这些滚动条连接到ScrollViewer