2013-02-04 2 views
3

을 대체 어떻게 스크롤바의의 ContextMenu를 대체하려고하고이 코드를 작성했습니다 :WPF는 - 스크롤의 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 명령을 제외한 모든 스크롤 막대가 활성화됩니다. '페이지 업'옵션과 같은 옵션을 클릭 할 때 스크롤 막대를 호스팅하는 컨트롤에 포커스가있을 때만 작동합니다 (자동으로 포커스가 맞추어지지 않음). 누구든지 이러한 문제를 해결하는 방법을 알고 있습니까?

편집 : 내 생각 엔 아마도 기본의 ContextMenu가 Opening 이벤트를 처리하고 제어 초점을 맞추고, 플러스 어딘가에 마우스로 클릭 된 지점의 위치를 ​​저장하는 것입니다. 하지만 어떻게이 기능을 XAML 파일에 넣을 수 있습니까 ???

답변

2

확인. 여기에 당신이 그것을 할 방법 :

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

내가 명령 대상을 실종됐다 ...