private void OnPreviewMouseWheel(Object sender, MouseWheelEventArgs e)
        {
            if (!this.CanScaleImage)
            {
                return;
            }

            var element = sender as FrameworkElement;

            if (element == null)
            {
                return;
            }

            // 親Grid取得
            var topGrid = element.Parents <Grid>().FirstOrDefault(p => p.Name == "topGrid");

            if (topGrid == null)
            {
                return;
            }

            // 親Gridが持つ子要素をそれぞれ取得

            var thumbnail = VisualTree.Descendants <Image>(topGrid)
                            .FirstOrDefault(d => d.Name == "thumbnail");

            var mainImage = VisualTree.Descendants <Image>(topGrid)
                            .FirstOrDefault(d => d.Name == "mainImage");

            if (thumbnail == null || mainImage == null)
            {
                return;
            }

            var scale = 1.0;

            // ホイール上に回す→拡大 / 下に回す→縮小
            if (e.Delta > 0)
            {
                scale = 1.25;
            }
            else
            {
                scale = 1 / 1.25;
            }

            // 拡大・縮小実施
            var thumbnailMatrix = (thumbnail.RenderTransform as MatrixTransform).Matrix;

            thumbnailMatrix.Scale(scale, scale);
            thumbnail.RenderTransform = new MatrixTransform(thumbnailMatrix);

            var mainImageMatrix = (mainImage.RenderTransform as MatrixTransform).Matrix;

            mainImageMatrix.Scale(scale, scale);
            mainImage.RenderTransform = new MatrixTransform(mainImageMatrix);
        }
        private void OnDragDelta(Object sender, DragDeltaEventArgs e)
        {
            if (!this.CanDragViewport)
            {
                return;
            }

            var element = sender as FrameworkElement;

            if (element == null)
            {
                return;
            }

            // 親Grid取得
            var topGrid = element.Parents <Grid>().FirstOrDefault(p => p.Name == "topGrid");

            if (topGrid == null)
            {
                return;
            }

            // 親Gridが持つ子要素をそれぞれ取得

            var scrollViewer = VisualTree.Descendants <ScrollViewer>(topGrid)
                               .FirstOrDefault(d => d.Name == "mainImageScrollViewer");

            var thumbnail = VisualTree.Descendants <Image>(topGrid)
                            .FirstOrDefault(d => d.Name == "thumbnail");

            if (scrollViewer == null || thumbnail == null)
            {
                return;
            }

            scrollViewer.ScrollToHorizontalOffset(
                scrollViewer.HorizontalOffset + (e.HorizontalChange * scrollViewer.ExtentWidth / thumbnail.ActualWidth));

            scrollViewer.ScrollToVerticalOffset(
                scrollViewer.VerticalOffset + (e.VerticalChange * scrollViewer.ExtentHeight / thumbnail.ActualHeight));
        }