如何为此禁用的WPF滚动条指定游标?

时间:2011-11-09 16:02:32

标签: wpf silverlight xaml

总结:我想指定在ScrollViewer禁用的滚动条上使用的游标。

将其粘贴到Kaxaml中并将鼠标移到禁用的垂直滚动条上。请注意,它使用的是我为ScrollViewer指定的Cross游标。将其与启用的水平滚动条上使用的箭头光标进行对比。

我不希望Cross显示禁用的垂直滚动条,因为它意味着特定操作可能不可用(这只是一个示例,我的应用程序使用不同的游标)。我更喜欢箭;任何人都可以告诉我如何做到这一点?

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel Orientation="Vertical">  
    <ScrollViewer Height="300" Width="300" HorizontalScrollBarVisibility="Visible"
Cursor="Cross">
      <Canvas Width="2000">
        <Button Canvas.Left="5" Canvas.Top="5">Left</Button>
        <Button Canvas.Left="1900" Canvas.Top="5">Right</Button>
      </Canvas>
    </ScrollViewer>
  </StackPanel>
</Page>

1 个答案:

答案 0 :(得分:1)

如果您希望滚动条上的各个按钮具有不同的光标,则需要将Cursor设置为ScrollBar级别,甚至可能设置为较低级别。不幸的是,ScrollBars的光标由ScrollViewer模板硬编码,因此您需要对其进行重新模板化。

这是一个简单的例子(评论后更新):

<Window x:Class="SO8067799.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="ScrollViewer">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate 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"/>
                            <Grid x:Name="verticalGrid" Grid.Column="1" Cursor="Hand">
                                <ScrollBar x:Name="PART_VerticalScrollBar" AutomationProperties.AutomationId="VerticalScrollBar"  Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>
                            </Grid>
                            <Grid x:Name="horizontalGrid" Grid.Row="1" Grid.Column="0" Cursor="Hand">
                                <ScrollBar x:Name="PART_HorizontalScrollBar" AutomationProperties.AutomationId="HorizontalScrollBar" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
                            </Grid>
                        </Grid>

                        <ControlTemplate.Triggers>
                            <Trigger SourceName="PART_VerticalScrollBar" Property="IsEnabled" Value="False">
                                <Setter TargetName="verticalGrid" Property="Cursor" Value="No"/>
                            </Trigger>
                            <Trigger SourceName="PART_HorizontalScrollBar" Property="IsEnabled" Value="False">
                                <Setter TargetName="horizontalGrid" Property="Cursor" Value="No"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <StackPanel Orientation="Vertical">
        <ScrollViewer Height="300" Width="300" HorizontalScrollBarVisibility="Visible">
            <Canvas Width="2000">
                <Button Canvas.Left="5" Canvas.Top="5">Left</Button>
                <Button Canvas.Left="1900" Canvas.Top="5">Right</Button>
            </Canvas>
        </ScrollViewer>
    </StackPanel>
</Window>