2010-06-20 48 views
1

我試圖將圖像從畫布上的一個位置拖放到另一個位置(應該比較簡單),但無法弄清楚。我想移動圖像具有以下XAML:將圖像拖放到WPF中

<Image Height="28" HorizontalAlignment="Left" Margin="842,332,0,0" Name="cityImage" Stretch="Fill" VerticalAlignment="Top" Width="42" Source="/Settlers;component/Images/city.png" MouseLeftButtonDown="cityImage_MouseLeftButtonDown" MouseMove="cityImage_MouseMove" MouseLeftButtonUp="cityImage_MouseLeftButtonUp"/> 

的代碼如下:

bool isDragging = false; Point initMousePos; private void cityImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { 
isDragging = true; 
initMousePos = e.GetPosition(theGrid); } private void cityImage_MouseMove(object sender, MouseEventArgs e) { 
if (isDragging) 
{ 
    Image image = sender as Image; 
    Canvas.SetTop(image, initMousePos.X); 
    Canvas.SetLeft(image, initMousePos.Y); 
    image.Visibility = System.Windows.Visibility.Visible; 
} } 

私人無效cityImage_MouseLeftButtonUp(對象發件人,MouseButtonEventArgs E){ isDragging = FALSE; }

回答

5

我做些什麼來完成你想要的是使用

System.Windows.Controls.Primitives.Thumb 

爲用戶控件的根,並設置控件模板來顯示圖像(邊界內,但它應該不爲很好地工作),是這樣的:

<Thumb Name="myRoot" DragDelta="MyRootDragDelta"> 
    <Thumb.Template> 
    <ControlTemplate> 
     <Image ... > 
     ... see below ... 
     </Image> 
    </ControlTemplate> 
    </Thumb.Template> 
</Thumb> 

而且,我綁定圖像的源到類的屬性:

<Image.Source> 
    <Binding Path="ImageSource" RelativeSource= 
       {RelativeSource FindAncestor, 
        AncestorType=my:MyImageControl, AncestorLevel=1}" /> 
</Image.Source> 

的用戶控件有一個名爲TranslateTransform(假設translateTransform),其性能XY都在DragDelta事件處理程序進行設置:

private void MyRootDragDelta(object sender, DragDeltaEventArgs e) 
{ 
    translateTransform.X += e.HorizontalChange; 
    translateTransform.Y += e.VerticalChange; 
} 

不要忘了補充:

public ImageSource ImageSource { get; set; } 

希望這幫助。如果有什麼不清楚的話,可以進一步詢問。

+0

您可能還需要爲UserControl的ImageSource屬性添加依賴項屬性,包括INotifyChanged支持。 – Andreas 2010-06-20 21:49:51

1

您想要將Canvas的Left和Top屬性設置爲除初始位置之外的其他屬性。在MouseMove處理程序中,您必須獲取相對於父項的位置。也;確保父元素是一個畫布而不是網格。圖像上有一個相當大的左邊距和上邊距,以及變量名稱爲「theGrid」的控件。