2013-04-30 76 views
1

我想弄清楚如何约束一个平底锅,使图像保持完全在其包含边界的范围内。任何帮助这方面将不胜感激。谢谢....WPF图像平移约束

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="MapTest.Window1" 
    Title="PanTest" 
    Width="484" 
    Height="400" 
    WindowStartupLocation="CenterScreen"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <TextBlock Margin="8,8,8,0" 
       TextWrapping="Wrap"> 
     To pan the image, simply click on it then drag. I'd like to 
     constrain the pan so that the image remains entirely within 
     the border, but without resorting to ClipToBounds. Any help 
     in this regard would be greatly appreciated. Thanks....</TextBlock> 
    <Border x:Name="border" 
      Margin="8" 
      BorderBrush="Black" 
      BorderThickness="1" 
      Grid.Row="1"> 
     <Image x:Name="image" 
       Source="Penguins.jpg" 
       Opacity="1" 
       Width="300" 
       Height="300" 
       Stretch="Uniform" 
       RenderTransformOrigin="0.5,0.5" /> 
    </Border> 
</Grid> 

using System.Linq; 
using System.Windows; 
using System.Windows.Input; 
using System.Windows.Media; 

namespace MapTest 
{ 
    public partial class Window1 : Window 
    { 
     private Point origin; 
     private Point start; 

     public Window1() 
     { 
      InitializeComponent(); 

      var group = new TransformGroup(); 

      group.Children.Add(new TranslateTransform()); 

      image.RenderTransform = group; 

      image.MouseLeftButtonDown += image_MouseLeftButtonDown; 
      image.MouseMove += image_MouseMove; 
      image.MouseLeftButtonUp += image_MouseLeftButtonUp; 
     } 

     private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      image.ReleaseMouseCapture(); 
     } 

     private void image_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (!image.IsMouseCaptured) 
       return; 

      var tt = (TranslateTransform)((TransformGroup)image.RenderTransform). 
       Children.First(tr => tr is TranslateTransform); 

      var vector = start - e.GetPosition(border); 

      tt.X = origin.X - vector.X; 
      tt.Y = origin.Y - vector.Y; 
     } 

     private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      image.CaptureMouse(); 

      var tt = (TranslateTransform)((TransformGroup)image.RenderTransform). 
       Children.First(tr => tr is TranslateTransform); 

      start = e.GetPosition(border); 

      origin = new Point(tt.X, tt.Y); 
     } 
    } 
} 
+0

您是否还要缩放或旋转图像,还是仅仅是翻译? – Clemens 2013-04-30 15:49:13

+0

是的,我计划缩放图像,并以90度为增量旋转它。为了简洁起见,我省略了示例代码中的缩放和旋转。 – 2013-04-30 16:41:21

回答

2

下面的代码为您提供了转换后的图像控制的坐标相对于边境控制的范围。您可以轻松检查边界是否位于Border控件内。

var rect = new Rect(image.RenderSize); 
var bounds = image.TransformToAncestor(border).TransformBounds(rect); 
+0

完美!感谢您的快速和相关的回复.... – 2013-04-30 22:51:59