2012-05-03 3 views
1

Я использую RenderTransform для перевода изображения с помощью событий дельта-манипуляции. Изображение, если оно мерцает, выходит из экрана. Как ограничить изображение, чтобы он оставался внутри сетки?Перевод изображений ограничивающие границы

Спасибо заранее

ответ

1

Вам нужно обрабатывать дельта события таким образом, что ваши переводы не покидают контейнер. Это из моего предыдущего проекта (_scatterViewItemTransform является CompositeTransform на мой щелкнул элемент, который размещен внутри контейнера (в ItemsControl с его ItemsPanel устанавливается на сетке):

protected override void OnManipulationDelta(ManipulationDeltaRoutedEventArgs e) 
{ 
    // Manipulation delta does not take UI scaling into account 
    var scaleString = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.DefaultContext.QualifierValues["scale"]; 
    var scale = Double.Parse(scaleString) * 0.01; 

    var x = _translateOrigin.X + e.Cumulative.Translation.X/scale; 
    var y = _translateOrigin.Y + e.Cumulative.Translation.Y/scale; 

    if (e.IsInertial) 
    { 
     while (x < Container.Padding.Left || 
      x > Container.ActualWidth - Container.Padding.Right) 
     { 
      if (x < Container.Padding.Left) 
       x = -x + 2 * Container.Padding.Left; 
      if (x > Container.ActualWidth - Container.Padding.Right) 
       x = 2 * (Container.ActualWidth - Container.Padding.Right) - x; 
     } 

     while (y < Container.Padding.Top || 
      y > Container.ActualHeight - Container.Padding.Bottom) 
     { 
      if (y < Container.Padding.Top) 
       y = -y + 2 * Container.Padding.Top; 
      if (y > Container.ActualHeight - Container.Padding.Bottom) 
       y = 2 * (Container.ActualHeight - Container.Padding.Bottom) - y; 
     } 
    } 

    _scatterViewItemTransform.TranslateX = x; 
    _scatterViewItemTransform.TranslateY = y; 

    if (!e.IsInertial) 
    { 
     BringIntoBounds(); 
    } 
} 


public void BringIntoBounds() 
{ 
    if (_scatterViewItemTransform.TranslateX < Container.Padding.Left) 
    { 
     _scatterViewItemTransform.TranslateX = Container.Padding.Left; 
    } 

    if (_scatterViewItemTransform.TranslateX > Container.ActualWidth - Container.Padding.Right) 
    { 
     _scatterViewItemTransform.TranslateX = Container.ActualWidth - Container.Padding.Right; 
    } 

    if (_scatterViewItemTransform.TranslateY < Container.Padding.Top) 
    { 
     _scatterViewItemTransform.TranslateY = Container.Padding.Top; 
    } 

    if (_scatterViewItemTransform.TranslateY > Container.ActualHeight - Container.Padding.Bottom) 
    { 
     _scatterViewItemTransform.TranslateY = Container.ActualHeight - Container.Padding.Bottom; 
    } 
} 
Смежные вопросы