none
关于拖动图片的问题 RRS feed

  • 问题

  • 直接上实例代码:

     <ScrollViewer x:Name="sv" RenderTransformOrigin="0.5,0.5"  Grid.Column="1" HorizontalScrollMode="Auto" VerticalScrollMode="Auto" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden">
                    <Image x:Name="imageView" Source="{Binding SelectedItem.Url, ElementName=listBoxImage, Mode=OneWay}"   ManipulationMode="All" ManipulationDelta="Photo_ManipulationDelta" 
                           RenderTransformOrigin="0.5,0.5" Stretch="None">
                        <Image.RenderTransform>
                            <CompositeTransform x:Name="PhotoTransform" />
                        </Image.RenderTransform>
                    </Image>
                </ScrollViewer>
     private void Photo_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
            {
                // Translate the photo
                PhotoTransform.TranslateX += e.Delta.Translation.X;
                PhotoTransform.TranslateY += e.Delta.Translation.Y;
                // Scale the photo
                PhotoTransform.ScaleX *= e.Delta.Scale;
                PhotoTransform.ScaleY *= e.Delta.Scale;
                // Constrain scale factor
                PhotoTransform.ScaleX = Math.Min(PhotoTransform.ScaleX, 4.0);
                PhotoTransform.ScaleY = Math.Min(PhotoTransform.ScaleY, 4.0);
                PhotoTransform.ScaleX = Math.Max(PhotoTransform.ScaleX, 1.0);
                PhotoTransform.ScaleY = Math.Max(PhotoTransform.ScaleY, 1.0);
            }

    现在可以实现拖动图片,但图片也会超出显示区域,不知道应该怎么限定下!!
    2012年8月22日 3:53

全部回复

  •             PhotoTransform.TranslateX += e.Delta.Translation.X;
                PhotoTransform.TranslateY += e.Delta.Translation.Y;

    这两行之前加一个判断,

    判断当前位置经过这次移动后是否超出当前显示区域,如果超出就禁止这次移动。

    2012年8月22日 4:47
  • 不知道怎么来判断!能来点代码吗?

    2012年8月22日 5:48
  • 问题补充:我试着把事件代码改成如下所示

     private void Photo_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
            {
                // Translate the photo
                var newTranslateX = PhotoTransform.TranslateX + e.Delta.Translation.X;
                var newTranslateY = PhotoTransform.TranslateY + e.Delta.Translation.Y;
                if (newTranslateX < -(sv.ActualWidth / 2) || newTranslateX > (sv.ActualWidth / 2))
                    return;
                else
                    PhotoTransform.TranslateX = newTranslateX;
                if (newTranslateY < -(sv.ActualHeight / 2) || newTranslateY > (sv.ActualHeight / 2))
                    return;
                else
                    PhotoTransform.TranslateY = newTranslateY;
                // Scale the photo
                PhotoTransform.ScaleX *= e.Delta.Scale;
                PhotoTransform.ScaleY *= e.Delta.Scale;
                // Constrain scale factor
                PhotoTransform.ScaleX = Math.Min(PhotoTransform.ScaleX, 4.0);
                PhotoTransform.ScaleY = Math.Min(PhotoTransform.ScaleY, 4.0);
                PhotoTransform.ScaleX = Math.Max(PhotoTransform.ScaleX, 1.0);
                PhotoTransform.ScaleY = Math.Max(PhotoTransform.ScaleY, 1.0);
            }

    些时,当使用“ctrl”+滚轮放大图片,再拖动图片时,图片的位置也要超出显示域。这个问题描述起来有些抽象,大家可以把代码运行下,就更好的明白我的问题了。
    2012年8月22日 8:30
  • 你的意思是

    使用Ctrl+滚轮放大图片以后,再拖动图片,拖动图片的距离能超过屏幕高度或者宽度的一半?

    2012年8月22日 11:11
  • "使用Ctrl+滚轮放大图片以后,再拖动图片,拖动图片的距离能超过屏幕高度或者宽度的一半?"

    拖动图片时,图片可以完全拖出显示区域以外,比如说上面代码中的ScrollViewer,当放大图片后,ScrollViewer滚动条会启动,但我把滚动条设为了不可见,这样,在我不使用拖动滚动条的情况下,在显示区没有办法看到图片的。

    不知道这样说得是不是更清楚些,这个问题不好形容,可以试着运行下代码。

    2012年8月23日 2:34
  • Hi,

    问题在ActualHeight和ActualWidth上。请看这段在ActualHeight中的话:

    For purposes of ElementName binding, ActualHeight does not post updates when it changes (due to its asynchronous and run-time calculated nature). Do not attempt to use ActualHeight as a binding source for an ElementName binding. If you have a scenario that requires updates based on ActualHeight, use a SizeChanged handler.

    ActualHeight并不会在改变的时候发送更新,而你不设置Height的话,ActualHeight就是0,只是根据里面的元素改变大小。所以你可以用事件SizeChanged来判断。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月23日 9:13
    版主
  • Hi,

    问题在ActualHeight和ActualWidth上。请看这段在ActualHeight中的话:

    For purposes of ElementName binding, ActualHeight does not post updates when it changes (due to its asynchronous and run-time calculated nature). Do not attempt to use ActualHeight as a binding source for an ElementName binding. If you have a scenario that requires updates based on ActualHeight, use a SizeChanged handler.

    ActualHeight并不会在改变的时候发送更新,而你不设置Height的话,ActualHeight就是0,只是根据里面的元素改变大小。所以你可以用事件SizeChanged来判断。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    不明白你得意思!!!
    2012年8月23日 10:32
  • 额,第一段好像离题有点远。

    第二段就是说你ActualHeight和ActualWidth得不到实际值,你可以自己把这两个输出看一下是多少。我认为是0.因此没办法做判断。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2012年8月23日 11:23
    版主