none
タッチパネル操作によるDataGridとScrollViewerの連動について RRS feed

  • 質問

  • タッチパネル操作によるDataGridとScrollViewerの連動について

    DataGrid上でスワイプした場合に外枠のScrollViewerに連動させたいのですが、方法が分かりません。実装方法を教えていただけないでしょうか?
    2016年6月23日 4:47

回答

  • こんな?

    <Window x:Class="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">
        <Grid>
            <ScrollViewer Margin="20" Background="Lime" 
                          HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" 
                          PanningMode="Both"
                          PreviewTouchMove="ScrollViewer_PreviewTouchMove">
                <Grid Width="1000" Height="1000">
                    <DataGrid Width="300" Height="300" TextElement.FontSize="20" Margin="20" HorizontalAlignment="Left" VerticalAlignment="Top"
                          ItemsSource="{Binding}" DataContext="ABCDCEFGHIJKLMNOPQRSTUVWXYZ">
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </Grid>
            </ScrollViewer>
        </Grid>
    </Window>
    Class MainWindow 
        Private Sub ScrollViewer_PreviewTouchMove(sender As Object, e As TouchEventArgs)
            Dim sv As ScrollViewer = CType(sender, ScrollViewer)
            Dim d = CType(e.Source, DependencyObject)
    
            If (TypeOf e.TouchDevice.Captured Is ScrollViewer) Then
                Dim svInner = CType(e.TouchDevice.Captured, ScrollViewer)
                Dim ctl As Control = TryCast(e.TouchDevice.Captured, Control)
                If (ctl IsNot Nothing) Then
                    If (TypeOf ctl.TemplatedParent Is DataGrid) Then
                        If (svInner.ReleaseTouchCapture(e.TouchDevice)) Then
                            sv.CaptureTouch(e.TouchDevice)
                            e.Handled = True
                        End If
                    End If
                End If
            End If
        End Sub
    End Class

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク u.daichi 2016年6月23日 10:25
    2016年6月23日 9:31

すべての返信

  • こんな?

    <Window x:Class="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">
        <Grid>
            <ScrollViewer Margin="20" Background="Lime" 
                          HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" 
                          PanningMode="Both"
                          PreviewTouchMove="ScrollViewer_PreviewTouchMove">
                <Grid Width="1000" Height="1000">
                    <DataGrid Width="300" Height="300" TextElement.FontSize="20" Margin="20" HorizontalAlignment="Left" VerticalAlignment="Top"
                          ItemsSource="{Binding}" DataContext="ABCDCEFGHIJKLMNOPQRSTUVWXYZ">
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/> <DataGridTextColumn Width="200" IsReadOnly="true"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </Grid>
            </ScrollViewer>
        </Grid>
    </Window>
    Class MainWindow 
        Private Sub ScrollViewer_PreviewTouchMove(sender As Object, e As TouchEventArgs)
            Dim sv As ScrollViewer = CType(sender, ScrollViewer)
            Dim d = CType(e.Source, DependencyObject)
    
            If (TypeOf e.TouchDevice.Captured Is ScrollViewer) Then
                Dim svInner = CType(e.TouchDevice.Captured, ScrollViewer)
                Dim ctl As Control = TryCast(e.TouchDevice.Captured, Control)
                If (ctl IsNot Nothing) Then
                    If (TypeOf ctl.TemplatedParent Is DataGrid) Then
                        If (svInner.ReleaseTouchCapture(e.TouchDevice)) Then
                            sv.CaptureTouch(e.TouchDevice)
                            e.Handled = True
                        End If
                    End If
                End If
            End If
        End Sub
    End Class

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク u.daichi 2016年6月23日 10:25
    2016年6月23日 9:31
  • gekka様

    はい。まさにその通りです。
    非常に助かりました。本当にありがとございます。
    2016年6月23日 10:25