Перетащите изображение в WPF - PullRequest
1 голос
/ 20 июня 2010

Я пытаюсь перетащить изображение из одного места на холсте в другое (должно быть относительно простым), но не могу понять это. Изображение, которое я хочу переместить, имеет следующий XAML:

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

private void cityImage_MouseLeftButtonUp (отправитель объекта, MouseButtonEventArgs e) { isDragging = false; }

Ответы [ 2 ]

5 голосов
/ 20 июня 2010

Что я делаю, чтобы достичь того, что вы хотите, это использовать

System.Windows.Controls.Primitives.Thumb 

как Root пользовательского элемента управления и установить 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; }

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

1 голос
/ 21 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...