2010-06-20 4 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 е) { isDragging = ложь; }

ответ

5

Что мне делать, чтобы выполнить то, что вы хотите использовать

System.Windows.Controls.Primitives.Thumb 

как корень UserControl и установите ControlTemplate для отображения изображения (в пределах границы, но он должен работать без а), что-то вроде:

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

UserControl имеет имени TranslateTransform (скажем translateTransform), свойства которого X и Y должны быть установлены в обработчике DragDelta события:

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

Не забудьте добавить:

public ImageSource ImageSource { get; set; } 

Надежда это помогает. Если что-то неясно, не стесняйтесь спрашивать дальше.

+0

Вы также можете добавить свойство зависимостей для свойства ImageSource UserControl, включая поддержку InotifyChanged. – Andreas

1

Вы хотите установить свойства Left и Top Canvas на что-то другое, кроме исходного. В обработчике MouseMove вам нужно получить позицию относительно родителя. Также; убедитесь, что родительский элемент является холстом, а не сеткой. У вас довольно большое левое и верхнее поле на изображении, а также элемент управления с именем переменной «theGrid».