Я выяснил возможный, простой способ перемещения элемента управления в стиле перетаскивания / перемещения ... Вот шаги.
- Выберите элемент в вашем контроле, который вы хотите быть областью движения. Это область, в которой, если пользователь удерживает кнопку мыши, элемент управления переместится. В моем случае это была прямоугольная граница в верхней части элемента управления.
- Используйте событие OnMouseDown, чтобы установить логическое значение (в моем случае IsMoving) в значение true, а событие MouseUp, чтобы установить его в значение false
В первом событии MouseDown установите свойство Point (InitialPosition), используя следующий код
if (FirstClick)
{
GeneralTransform transform = this.TransformToAncestor(this.Parent as Visual);
Point StartPoint = transform.Transform(new Point(0, 0));
StartX = StartPoint.X;
StartY = StartPoint.Y;
FirstClick = false;
}
Теперь, когда у вас есть начальная позиция, вам нужно получить положение мыши относительно вашего управления движением. Это делается для того, чтобы вы не щелкали середину заголовка, чтобы переместить его, и он мгновенно перемещает верхнюю левую часть элемента управления в положение указателя мыши. Для этого поместите этот код в событие MouseDown:
Point RelativeMousePoint = Mouse.GetPosition(Header);
RelativeX = RelativeMousePoint.X;
RelativeY = RelativeMousePoint.Y;
Теперь у вас есть точка, из которой был создан элемент управления (startX и STartY), положение мыши внутри элемента управления перемещением (RelativeX, RelativeY), нам просто нужно переместить элемент управления в новое место! Есть несколько шагов, связанных с этим. Во-первых, ваш элемент управления должен иметь RenderTransform, который представляет собой TranslateTransform. Если вы не хотите устанавливать это в XAML, не стесняйтесь устанавливать его, используя this.RenderTransform = new TranslateTransform
.
Теперь нам нужно установить координаты X и Y в RenderTransform, чтобы элемент управления переместился в новое место. Следующий код выполняет это
private void Header_MouseMove(object sender, MouseEventArgs e)
{
if (IsMoving)
{
//Get the position of the mouse relative to the controls parent
Point MousePoint = Mouse.GetPosition(this.Parent as IInputElement );
//set the distance from the original position
this.DistanceFromStartX= MousePoint.X - StartX - RelativeX ;
this.DistanceFromStartY= MousePoint.Y - StartY - RelativeY;
//Set the X and Y coordinates of the RenderTransform to be the Distance from original position. This will move the control
TranslateTransform MoveTransform = base.RenderTransform as TranslateTransform;
MoveTransform.X = this.DistanceFromStartX;
MoveTransform.Y = this.DistanceFromStartY;
}
}
Как вы можете догадаться, немного кода оставлено (объявления переменных и т. Д.), Но это должно быть все, что вам нужно для начала работы :) happy coding.
EDIT:
Одна из проблем, с которой вы можете столкнуться, заключается в том, что это позволяет вам переместить элемент управления из области его родительского элемента управления. Вот быстрый и грязный код для решения этой проблемы ...
if ((MousePoint.X + this.Width - RelativeX > Parent.ActualWidth) ||
MousePoint.Y + this.Height - RelativeY > Parent.ActualHeight ||
MousePoint.X - RelativeX < 0 ||
MousePoint.Y - RelativeY < 0)
{
IsMoving = false;
return;
}
Поместите этот код в событие MouseMove до того, как произойдет фактическое движение. Это проверит, пытается ли элемент управления выйти за пределы родительского элемента управления. Команда IsMoving = false
заставит элемент управления выйти из режима движения. Это означает, что пользователю нужно будет снова щелкнуть область перемещения, чтобы попытаться переместить элемент управления, поскольку он остановится на границе. Если вы хотите, чтобы элемент управления автоматически продолжал движение, просто выведите эту строку, и элемент управления вернется к курсору, как только он вернется в допустимую область.