2012-05-16 25 views
2

我找不到屬性或我需要的對象。如何不將圖像拖出框架?

我已經實現了一個可拖動和可縮放的圖像,但是我可以將它拖出屏幕,因此我失去了圖像。

我應該把我的圖像放在一個盒子裏面(可能還有很好的彈跳效果)?

編輯:

Pratically我的形象一直停留在StackPanel中,只有放大的可能性。 (最大縮小爲第一個渲染)。

的代碼位:

private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e) 
    { 
     initialAngle = compositeTransform.Rotation; 
     initialScale = compositeTransform.ScaleX; 
    } 

    private void OnPinchDelta(object sender, PinchGestureEventArgs e) 
    { 
     compositeTransform.ScaleX = initialScale * e.DistanceRatio; 
     compositeTransform.ScaleY = initialScale * e.DistanceRatio; 
    } 

    private void OnDragDelta(object sender, DragDeltaGestureEventArgs e) 
    { 
     compositeTransform.TranslateX += e.HorizontalChange; 
     compositeTransform.TranslateY += e.VerticalChange; 
    } 

    <StackPanel x:Name="container"> 
     <Image x:Name="image_chart"> 
      <Image.RenderTransform> 
       <TransformGroup> 
        <ScaleTransform x:Name="scale" /> 
        <TranslateTransform x:Name="transform" /> 
        <CompositeTransform x:Name="compositeTransform"/> 
       </TransformGroup> 
      </Image.RenderTransform> 
      <toolkit:GestureService.GestureListener> 
       <toolkit:GestureListener PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta" 
             DragDelta="OnDragDelta"/> 
      </toolkit:GestureService.GestureListener> 
     </Image> 
    </StackPanel> 

EDIT 2 - 半回答

我終於找出如何停止縮小爲原來的大小!

private void OnPinchDelta(object sender, PinchGestureEventArgs e) 
    { 
     if (1.0 <= (initialScale * e.DistanceRatio)) 
     { 
      compositeTransform.ScaleX = initialScale * e.DistanceRatio; 
      compositeTransform.ScaleY = initialScale * e.DistanceRatio; 
     } 
    } 

If條件表示:如果我放大 - >沒有問題,因爲e.DistanceRatio> 1。如果我縮小,我會停止,直到initialScale將是相同的!

現在我仍然需要幫助如何避免在外面拖動。

+0

你目前如何實現的呢? – Pol

+0

我已經添加了一些代碼。 – Enrichman

回答

1

好吧,我找到了解決方案,但我需要一些改進。 縮放工作,但是當圖像在右邊它去所有在左邊(因爲它的比例從TOP_LEFT眼角..

下面是「堵拖」的代碼:

private void OnDragDelta(object sender, DragDeltaGestureEventArgs e) 
    { 

     double realWidth = image_chart.ActualWidth*compositeTransform.ScaleX; 
     double realHeight = image_chart.ActualHeight * compositeTransform.ScaleY; 

     if(compositeTransform.TranslateX>=0) 
      compositeTransform.TranslateX = Math.Max(container.ActualWidth - realWidth, 
               Math.Min(0, compositeTransform.TranslateX + e.HorizontalChange)); 
     else 
      compositeTransform.TranslateX = Math.Max(container.ActualWidth - realWidth, 
                Math.Min(0, compositeTransform.TranslateX + e.HorizontalChange)); 
     if(compositeTransform.TranslateY>=0) 
      compositeTransform.TranslateY = Math.Max(container.ActualHeight - realHeight, 
               Math.Min(0, compositeTransform.TranslateY + e.VerticalChange)); 
     else 
      compositeTransform.TranslateY = Math.Max(container.ActualHeight - realHeight, 
                Math.Min(0, compositeTransform.TranslateY + e.VerticalChange)); 

編輯:

在我已經決定使用WebBrowser結束..更加「平滑」和愉快

+0

謝謝@Enrichman我已經試過您的解決方案,併爲我工作:),但它不順暢平等的web瀏覽器就可以實現這一目標與我們的節目? – kartheek

+0

幸福,這對你有幫助!呃,我不確定..正如我最後說的,我放棄了!太簡單的東西太多的問題! :) – Enrichman

+0

是的...我也想用webBrowser來顯示圖像在我的應用程序 – kartheek

0

假設在開始的形象是在左上角(並注意檢查此縮放後仍然有效):

private void OnDragDelta(object sender, DragDeltaGestureEventArgs e) 
{ 
    compositeTransform.TranslateX = Math.Min(container.ActualWidth - image_chart.ActualWidth, 
     Math.Max(0, 
      compositeTransform.TranslateX + e.HorizontalChange)); 
    compositeTransform.TranslateY = Math.Min(container.ActualHeight - image_chart.ActualHeight, 
     Math.Max(0, 
      compositeTransform.TranslateY + e.VerticalChange)); 
} 
+0

嗯..沒有,對不起,這是行不通的,但你給了我一個很好的提示。 檢查我的答案! – Enrichman

1

我的解決方案:

XAML代碼

<StackPanel x:Name="Scroll" Margin="0"> 
        <Image CacheMode="BitmapCache" Name="FrontCover" Source="{Binding FullCover}" > 
         <Image.RenderTransform> 
          <CompositeTransform x:Name="transform" ScaleX="1" ScaleY="1" /> 
         </Image.RenderTransform> 
         <toolkit:GestureService.GestureListener> 
          <toolkit:GestureListener PinchDelta="OnPinchDelta" PinchStarted="OnPinchStarted" DragDelta="OnDragDelta" /> 
         </toolkit:GestureService.GestureListener> 
        </Image> 
      </StackPanel> 

 double initialScale; 

    private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e) 
    { 
     initialScale = transform.ScaleX; 
    } 

    private void OnPinchDelta(object sender, PinchGestureEventArgs e) 
    { 
     var curZoom = initialScale * e.DistanceRatio; 
     if (curZoom >= 1 && curZoom <= 3) 
     { 
      transform.ScaleX = curZoom; 
      transform.ScaleY = curZoom; 

     } 
    } 

    private void OnDragDelta(object sender, DragDeltaGestureEventArgs e) 
    { 
     transform.CenterX = (transform.CenterX - e.HorizontalChange); 
     transform.CenterY = (transform.CenterY - e.VerticalChange); 

     if (transform.CenterX < 0) 
      transform.CenterX = 0; 
     else if (transform.CenterX > Scroll.ActualWidth) 
      transform.CenterX = Scroll.ActualWidth; 
     else if (transform.CenterX > (FrontCover.Height * transform.ScaleX)) 
      transform.CenterX = FrontCover.Height * transform.ScaleX; 

     if (transform.CenterY < 0) 
      transform.CenterY = 0; 
     else if (transform.CenterY > Scroll.ActualHeight) 
      transform.CenterY = Scroll.ActualHeight; 
     else if (transform.CenterY > (FrontCover.Height * transform.ScaleY)) 
      transform.CenterY = FrontCover.Height * transform.ScaleY; 

    } 

覺得應該幫助別人