2016-08-05 8 views
2

사용자 정의 컨트롤을 패닝 할 때 스크롤링이 발생하지 않습니다. Panel에서 파생 된 사용자 정의 컨트롤을 가지고 있는데이 컨트롤을 ScrollViewer 안에 배치했습니다. 그리고 내 사용자 지정 컨트롤에 대해 ManipulationMode을 "모두"로 설정했습니다. ManipulationDelta을 실행하고 ScrollViewer에서 ChangeView 메서드를 사용하여 VericalOffsetHorizontalOffSet을 변경합니다. VerticalOffSet 및 HorizontalOffSet은 내 패닝을 기반으로 내 패널에 설정되지만보기에는 변경 사항이 없으므로 ScrollViewer은 패널을 보유합니다.UWP에서 패닝 할 때 ScrollViewer가 하위 요소를 보유합니다.

나는 많은 방법을 피곤하지만 문제가 해결되지 않았습니다. ViewChanging을 트리거하고 VerticalOffSetHorizontalOffSet을 설정하십시오. ScrollViewer에 대해 ManipulationDelta을 트리거하고 VerticalOffSetHorizontalOffSet을 설정합니다. ManipulationStaring, ManipulationDeltaManipulationCompleted을 발생 시키면 CustomPanel 및 ScrollViewer에 대해 VerticalOffSetHorizontalOffSet을 설정합니다.

<Grid> 
     <ScrollViewer x:Name="scrollViewer" 

         HorizontalScrollBarVisibility="Visible" 
         VerticalScrollBarVisibility="Visible" 
         HorizontalAlignment="Left" 
         VerticalAlignment="Top"> 
      <local:CustomPanel x:Name="customPanel" Height="800" Width="900" 
           ManipulationMode="All"/> 
     </ScrollViewer> 
    </Grid> 
private void OnContainerOnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 
    { 

     if (scrollViewer!= null) 
     { 
      if (scrollViewer.HorizontalScrollMode == ScrollMode.Disabled && scrollViewer.VerticalScrollMode == ScrollMode.Disabled) 
       return; 
      var verticalOffset = e.Delta.Translation.Y; 
      var horizontalOffset = e.Delta.Translation.X; 
      this.scrollViewer.ChangeView(null, VerticalOffset - verticalOffset, null, true); 
     this.scrollViewer.ChangeView(HorizontalOffset - horizontalOffset, null, null, true);); 

      e.Handled = true; 
     } 

    } 

참고 : 고정 행이 깜박 거림있는 ManipulationMode을 설정하지 않고 스크롤하는 동안 내가 그렇게 단지 내가 ManipulationDelta 트리거, 우리의 사용자 정의 그리드 (CustomPanel)의 일부 고정 행을 가지고있다.

이 문제에 대한 제안이 있으십니까?

답변

0

사용자 정의 컨트롤을 패닝 할 때 스크롤링이 발생하지 않습니다.

정확하게 이해하면 문제는 VerticalOffset - verticalOffsetHorizontalOffset - horizontalOffset의 값이 변경되지 않는다고 생각합니다.

그리고 일반적으로 조작은 RenderTransform과 협력합니다. UIElement를 패닝하려면 에 TranslateTransform을 제공해야합니다.

나는 데모를 만들어 아래처럼 코드를 수정 :

public sealed partial class MainPage : Page 
{ 
    private TranslateTransform dragTranslation; 
    private double HorizontalOffset; 
    private double VerticalOffset; 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     customPanel.ManipulationDelta += CustomPanel_ManipulationDelta; 
     dragTranslation = new TranslateTransform(); 
     //give a translate transform to customPanel. 
     customPanel.RenderTransform = this.dragTranslation; 
    } 

    private void CustomPanel_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 
    { 
     if (scrollViewer != null) 
     { 
      if (scrollViewer.HorizontalScrollMode == ScrollMode.Disabled && scrollViewer.VerticalScrollMode == ScrollMode.Disabled) 
       return; 
      var verticalOffset = e.Delta.Translation.Y; 
      var horizontalOffset = e.Delta.Translation.X; 
      this.dragTranslation.X += horizontalOffset; 
      this.dragTranslation.Y += verticalOffset; 
      HorizontalOffset += horizontalOffset;//Here dynamically increase the HorizontalOffset; 
      VerticalOffset += verticalOffset;//Here dynamically increase the VerticalOffset; 
      this.scrollViewer.ChangeView(null,VerticalOffset, null, true); 
      this.scrollViewer.ChangeView(HorizontalOffset, null, null, true); 
      e.Handled = true; 
     } 
    } 
} 

그리고 XAML :

<ScrollViewer x:Name="scrollViewer" VerticalAlignment="Center" 
        HorizontalScrollBarVisibility="Visible" 
        VerticalScrollBarVisibility="Visible" 
        HorizontalAlignment="Left" 
        > 
     <local:CustomPanel x:Name="customPanel" Width="800" Height="800" 
          ManipulationMode="All" VerticalAlignment="Center"> 
      <TextBlock> Panning Me</TextBlock> 
     </local:CustomPanel> 
</ScrollViewer> 

당신은 내가 HorizontalOffsetVerticalOffset 증가, 매번 CustomPanel_ManipulationDelta 트리거 볼 수 있듯이. 여기

은 결과입니다 :

enter image description here

+0

엘비스 - 당신의 제안을 주셔서 감사합니다, 나는 모바일 장치에서 내 옆에 당신의 제안을 확인하지만, 그 행위에서 난 것이 아니니있다. 내 요구 사항을 충족시킬 수있는 해결책이 있습니까? –

+0

이 문제를 재현 할 수있는 기본 데모를 공유하고 싶습니다. 데모를 직접 수정하려고합니다. –