WPF ScrollViewer - 将水平滚动条对齐到顶部?

Eya*_*ron 2 c# wpf scrollbar scrollviewer

我想知道是否可以将 ScrollViewer 控件中的水平滚动条停靠在顶部而不是底部?如果没有,是否可以使用放置在 ScrollViewer 上方的整个单独的 Scrollbar 控件并以某种方式将 ScrollBar_Scroll 事件分配给它?

提前致谢!

Jay*_*Jay 5

当然 - 这是修改为转置网格行 0 和网格行 1 的默认模板ScrollViewer,它将水平滚动条放在顶部:

<ControlTemplate x:Key="ScrollViewerHorizontalOnTopTemplate" TargetType="{x:Type ScrollViewer}">
            <Grid x:Name="Grid" Background="{TemplateBinding Background}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" MinHeight="17"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Rectangle x:Name="Corner" 
                    Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
                    Grid.Column="1" Grid.Row="0"/>
                <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" Grid.Column="0" Grid.Row="1" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False"/>
                <ScrollBar x:Name="PART_VerticalScrollBar" 
                    Cursor="Arrow" 
                    Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
                    Grid.Column="1" Grid.Row="1" 
                    AutomationProperties.AutomationId="VerticalScrollBar" 
                    Maximum="{TemplateBinding ScrollableHeight}" 
                    Minimum="0" 
                    Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                    ViewportSize="{TemplateBinding ViewportHeight}"/>
                <ScrollBar x:Name="PART_HorizontalScrollBar" 
                    Cursor="Arrow" 
                    Grid.Column="0" 
                    AutomationProperties.AutomationId="HorizontalScrollBar" 
                    Maximum="{TemplateBinding ScrollableWidth}" 
                    Minimum="0" 
                    Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                    Orientation="Horizontal" 
                    ViewportSize="{TemplateBinding ViewportWidth}"/>
            </Grid>
        </ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

将此模板应用到您的应用程序中ScrollViewer,您应该已准备就绪。

Expression Blend 使这样的任务变得微不足道——我推荐它。