在WPF中,如何在ScrollViewer中自定义ScrollBar的样式。

问题描述 投票:0回答:1

我可以添加一个ScrollBar样式为全局样式,但这也会改变除了ScrollViewer以外的所有ScrollBar的样式。但是这也会改变除了ScrollViewer以外的所有ScrollBar的样式,我怎样才能只改变ScrollViewer中ScrollBar的样式呢?也许可以添加一个带Key的样式,并将其指定到某个地方,比如ControlTemplate。

这是我的完全的ScrollBar样式,我可以在ScrollViewer中添加一个ScrollBar样式。

<Style x:Key="ScrollBarThumb" TargetType="{x:Type Thumb}">
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="IsTabStop" Value="false"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Thumb}">
                <Border x:Name="rectangle"
                            SnapsToDevicePixels="True"
                            Background="{StaticResource WordBlueBrush}"
                            Opacity="0.3"
                            CornerRadius="4"
                            Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}"/>   
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="rectangle" Property="Opacity" Value="1" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type ScrollBar}">
    <Setter Property="Stylus.IsPressAndHoldEnabled" Value="false"/>
    <Setter Property="Stylus.IsFlicksEnabled" Value="false"/>

    <Setter Property="Width" Value="14"/>
    <Setter Property="Margin" Value="-14 0 0 0" />
    <Setter Property="MinWidth" Value="{Binding Height, RelativeSource={RelativeSource Self}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollBar}">
                <Grid x:Name="Bg" SnapsToDevicePixels="true">

                    <Border Padding="0 4">
                        <Track x:Name="PART_Track"
                        IsDirectionReversed="true"
                        IsEnabled="{TemplateBinding IsMouseOver}"
                        Width="8"
                        HorizontalAlignment="Center"
                           >
                            <Track.DecreaseRepeatButton>
                                <RepeatButton Opacity="0" Command="{x:Static ScrollBar.PageUpCommand}" />
                            </Track.DecreaseRepeatButton>
                            <Track.IncreaseRepeatButton>
                                <RepeatButton Opacity="0" Command="{x:Static ScrollBar.PageDownCommand}" />
                            </Track.IncreaseRepeatButton>
                            <Track.Thumb>
                                <Thumb Style="{StaticResource ScrollBarThumb  }" />
                            </Track.Thumb>
                        </Track>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
wpf xaml styles
1个回答
0
投票

最后,我有了解决方案。

1、给ScrollBar添加一个键。

<Style x:Key="ViewerScrollBar" TargetType="{x:Type ScrollBar}">

第二,在Visual Studio XAML Designer中右击ScrollViewer。选择'Edit Template'->'Edit a Copy'。

为ScrollViewer添加ControlTemplate。

第三,在 "创建样式资源 "对话框中,为ScrollViewer样式指定一个键,然后点击 "确定"。

创建样式资源对话框

4、Visual Studio将自动为我的ScrollViewer创建ControlTemplate,现在,为水平ScrollBar和垂直ScrollBar添加Style="{StaticResource ViewerScrollBar}"。现在,为水平滚动条和垂直滚动条添加Style="{StaticResource ViewerScrollBar}"。

    <ControlTemplate x:Key="ScrollViewerControlTemplate" 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 Style="{StaticResource ViewerScrollBar}" 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}"/>
            <ScrollBar Style="{StaticResource ViewerScrollBar}" 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>
© www.soinside.com 2019 - 2024. All rights reserved.