2011-01-26 4 views
0

Я работаю с WPF 4 и VB.net 2010. Мой проект состоит из полноэкранных окон с сеткой 640x480 в центре.Как плавно перетаскивать окно изображения в WPF?

В этом проекте я хочу иметь различные ящики изображений (в которых будут отображаться изображения .png), которые пользователь может перетащить и поместить в разные места на сетке.

В сущности, мне нужно, чтобы можно было щелкнуть элемент и перетащить его вокруг сетки, при этом окно изображения все еще видно и того же размера, что и пользователь, перемещающий его. Он никогда не сможет покинуть сетку. Я также должен иметь возможность определить, находится ли объект над другим объектом, поэтому, когда кнопка мыши отпущена, перетаскиваемый объект «отбрасывается», и он запускает определенный блок кода.

Как это сделать?

ответ

0

Нечто похожее на ваш «проект», но с использованием C#

От http://pastie.org/1498237

// XAML 

<Window x:Class="MyProject.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="500" Width="500"> 
    <Grid> 
     <Canvas x:Name="mycanv"> 
      <Image Width="150" x:Name="myimg" Source="some_source.png"/> 
     </Canvas> 
    </Grid> 
</Window> 

//C# 

private Point mouseClick; 
private double canvasLeft; 
private double canvasTop; 
public Window1() 
{ 
    InitializeComponent(); 
    foreach (object obj in mycanv.Children) 
    { 
     try 
     { 
      Image img = (Image)obj; 
      img.PreviewMouseDown += new MouseButtonEventHandler(myimg_MouseDown); 
      img.PreviewMouseMove += new MouseEventHandler(myimg_MouseMove); 
      img.PreviewMouseUp += new MouseButtonEventHandler(myimg_MouseUp); 
      img.TextInput += new TextCompositionEventHandler(myimg_TextInput); 
      img.LostMouseCapture += new MouseEventHandler(myimg_LostMouseCapture); 
      img.SetValue(Canvas.LeftProperty, 0.0); 
      img.SetValue(Canvas.TopProperty, 0.0); 
     } 
     catch 
     { 
      //do something 
     } 
    } 
} 

void myimg_LostMouseCapture(object sender, MouseEventArgs e) 
{ 
    ((Image)sender).ReleaseMouseCapture(); 
} 

void myimg_TextInput(object sender, TextCompositionEventArgs e) 
{ 
    ((Image)sender).ReleaseMouseCapture(); 
} 

void myimg_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    ((Image)sender).ReleaseMouseCapture(); 
} 

void myimg_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (((Image)sender).IsMouseCaptured) 
    { 
     Point mouseCurrent = e.GetPosition(null); 
     double Left = mouseCurrent.X - canvasLeft; 
     double Top = mouseCurrent.Y - canvasTop; 
     ((Image)sender).SetValue(Canvas.LeftProperty, canvasLeft + Left); 
     ((Image)sender).SetValue(Canvas.TopProperty, canvasTop + Top); 
     canvasLeft = Canvas.GetLeft(((Image)sender)); 
     canvasTop = Canvas.GetTop(((Image)sender)); 
    } 
} 

void myimg_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    mouseClick = e.GetPosition(null); 
    canvasLeft = Canvas.GetLeft(((Image)sender)); 
    canvasTop = Canvas.GetTop(((Image)sender)); 
    ((Image)sender).CaptureMouse(); 
} 
+0

Когда я попытался аналогичный код в других проектах, есть несоответствие между положением мыши и положение объекта , потому что объект находится в сетке 640x480, и разрешение обычно больше. Как мне обойти это? – CodeMouse92

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