WPF ScrollViewer - выровнять горизонтальную полосу прокрутки вверх? - PullRequest
2 голосов
/ 24 августа 2010

Мне интересно, можно ли прикрепить горизонтальную полосу прокрутки в элементе управления ScrollViewer к вершине, а не расположить ее внизу? Если нет, можно ли использовать целый отдельный элемент управления Scrollbar, расположенный над ScrollViewer, и каким-либо образом назначить ему события ScrollBar_Scroll?

Заранее спасибо!

1 Ответ

4 голосов
/ 24 августа 2010

Конечно - вот шаблон по умолчанию для ScrollViewer, модифицированный для транспонирования строки 0 сетки и строки 1 сетки, в результате чего горизонтальная полоса прокрутки располагается сверху:

<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>

Примените этот шаблон к вашему ScrollViewer, и все должно быть готово.

Expression Blend делает такие задачи тривиальными - я рекомендую.

...