2012-05-16 2 views
2

Я не могу найти недвижимость или объект, который мне нужен.Как не вытащить изображение из рамки?

Я реализовал перетаскиваемое и масштабируемое изображение, но я могу вытащить его из экрана, поэтому я потерял изображение из вида.

Где я должен помещать свое изображение, чтобы держать его внутри коробки (и, возможно, с хорошим эффектом отскока)?

EDIT:

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; 
     } 
    } 

условие Если означает: если я масштабирование -> нет проблем, потому что 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)); 

EDIT:

в конце концов я решил использовать WebBrowser .. гораздо более «гладким» и приятным

+0

Спасибо @Enrichman, я пробовал ваше решение и работал для меня :), но он не такой ровный, как webBrowser, мы можем добиться этого с помощью нашего программирования? – 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; 

    } 

Думаю, это должно помочь другим

Смежные вопросы