WPF-如何替换滚动条上下文菜单

WPF-如何替换滚动条上下文菜单,wpf,scrollbar,contextmenu,Wpf,Scrollbar,Contextmenu,我正在尝试替换滚动条的ContextMenu,我编写了以下代码: <ContextMenu x:Key="ScrollBarContextMenu" x:Shared="True"> <MenuItem Header="Scroll _Here" Name="SH" Command="ScrollBar.ScrollHereCommand" /> <Separator/> <MenuItem Header="_Top" Name=

我正在尝试替换滚动条的ContextMenu,我编写了以下代码:

<ContextMenu x:Key="ScrollBarContextMenu" x:Shared="True">
    <MenuItem Header="Scroll _Here" Name="SH" Command="ScrollBar.ScrollHereCommand" />
    <Separator/>
    <MenuItem Header="_Top" Name="T" Command="ScrollBar.ScrollToTopCommand" />
    <MenuItem Header="_Bottom" Name="B" Command="ScrollBar.ScrollToBottomCommand" />
    <Separator/>
    <MenuItem Header="Page _Up" Name="PU" Command="ScrollBar.PageUpCommand" />
    <MenuItem Header="Page _Down" Name="PD" Command="ScrollBar.PageDownCommand" />
    <Separator/>
    <MenuItem Header="Scroll U_p" Name="SU" Command="ScrollBar.LineUpCommand" />
    <MenuItem Header="Scroll Dow_n" Name="SD" Command="ScrollBar.LineDownCommand" />
</ContextMenu>


<Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="ContextMenu" Value="{DynamicResource ScrollBarContextMenu}"/>
    <Style.Triggers>
        <Trigger Property="Orientation" Value="Horizontal">
            <Setter Property="Width" Value="Auto"/>
            <Setter Property="Height" Value="18" />
            <Setter Property="Template" Value="{StaticResource HorizontalScrollBar}" />
        </Trigger>
        <Trigger Property="Orientation" Value="Vertical">
            <Setter Property="Width" Value="18"/>
            <Setter Property="Height" Value="Auto" />
            <Setter Property="Template" Value="{StaticResource VerticalScrollBar}" />
        </Trigger>
    </Style.Triggers>
</Style>

ContextMenu设置好了,但它的行为很奇怪。最初,它的所有菜单项都被禁用。当您滚动滚动条时,它们都被启用,但ScrollHere命令永远处于禁用状态。此外,当单击一个选项时,即“Page Up”(向上翻页)选项,它仅在承载滚动条的控件处于聚焦状态时工作(不会自动聚焦)。有人知道如何解决这些问题吗

编辑:
我的猜测是,默认的ContextMenu可能会处理
打开
事件并聚焦控件,此外,它还将鼠标单击的点的位置存储在某个位置。但是如何将此功能放在XAML文件中?

好的。以下是您的操作方法:

        <ContextMenu x:Key="VScrollBarContextMenu" x:Shared="true">
            <MenuItem Header="{DynamicResource ScrollHere}" Command="ScrollBar.ScrollHereCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
            <Separator/>
            <MenuItem Header="{DynamicResource ScrollTop}" Command="ScrollBar.ScrollToTopCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <MenuItem Header="{DynamicResource ScrollBottom}" Command="ScrollBar.ScrollToBottomCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <Separator/>
            <MenuItem Header="{DynamicResource ScrollPageUp}" Command="ScrollBar.PageUpCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <MenuItem Header="{DynamicResource ScrollPageDown}" Command="ScrollBar.PageDownCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <Separator/>
            <MenuItem Header="{DynamicResource ScrollUp}" Command="ScrollBar.LineUpCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <MenuItem Header="{DynamicResource ScrollDown}" Command="ScrollBar.LineDownCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
        </ContextMenu>

        <ContextMenu x:Key="HScrollBarContextMenu" x:Shared="true">
            <MenuItem Header="{DynamicResource ScrollHere}" Command="ScrollBar.ScrollHereCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
            <Separator/>
            <MenuItem Header="{DynamicResource ScrollLeftEnd}" Command="ScrollBar.ScrollToLeftEndCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <MenuItem Header="{DynamicResource ScrollRightEnd}" Command="ScrollBar.ScrollToRightEndCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <Separator/>
            <MenuItem Header="{DynamicResource ScrollPageLeft}" Command="ScrollBar.PageLeftCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <MenuItem Header="{DynamicResource ScrollPageRight}" Command="ScrollBar.PageRightCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <Separator/>
            <MenuItem Header="{DynamicResource ScrollLeft}" Command="ScrollBar.LineLeftCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
            <MenuItem Header="{DynamicResource ScrollRight}" Command="ScrollBar.LineRightCommand" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
        </ContextMenu>

我错过了指挥目标