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

Category: fx wpf_ja

Question

u.daichi on Thu, 23 Jun 2016 04:47:05


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

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

Replies

gekka on Thu, 23 Jun 2016 09:31: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

u.daichi on Thu, 23 Jun 2016 10:25:45


gekka様

はい。まさにその通りです。
非常に助かりました。本当にありがとございます。