Создание подвижного управления в WPF

У меня есть панель, в той панели несколько прямоугольных средств управления (количество беличьих мехов средств управления), я хочу, чтобы пользователь смог переместить средства управления в панели так, чтобы они могли расположить средства управления в пути, который удовлетворяет им лучше всего. у кого-либо есть какие-либо ресурсы, которые я мог считать или простые подсказки, которые получат меня возглавляемый вниз правильная дорога?

спасибо

8
задан TerrorAustralis 14 May 2010 в 00:06
поделиться

2 ответа

Я придумал возможный, простой метод перемещения элемента управления в стиле перетаскивания/перемещения... Вот шаги.

  1. Выберите элемент управления, который должен быть областью движения. Это область, в которой, если пользователь удержит мышь, элемент управления будет перемещаться. В моем случае это была прямоугольная граница в верхней части контроля.
  2. Используйте событие OnMouseDown, чтобы установить логическое значение (в моем случае IsMoving) на true, а событие MouseUp — значение false
  3. При первом событии MouseDown задайте некоторое свойство Point (InitialPosition), используя следующий код

    if (FirstClick)
    {
     Преобразование GeneralTransform = это. TransformToAncestor(this. Родитель как визуальный);
     Точка StartPoint = преобразование. Преобразование(новая точка(0, 0));
     StartX = StartPoint.X;
     StartY = StartPoint.Y;
     FirstClick = false;
    }
    
  4. Теперь, когда у вас есть начальное положение, вам нужно получить положение мыши относительно вашего управления движением.Это делается для того, чтобы вы не щелкнули середину заголовка, чтобы переместить его, и он мгновенно переместил верхнюю левую часть элемента управления в расположение указателя мыши. Для этого поместите этот код в событие MouseDown:

    Point RelativeMousePoint = Mouse.GetPosition(Header);
    RelativeX = RelativeMousePoint.X;
    RelativeY = RelativeMousePoint.Y;
    
  5. Теперь у вас есть точка, в которую возник элемент управления (startX и STartY), положение мыши в вашем управлении движением (RelativeX, RelativeY), нам просто нужно переместить элемент управления в новое место! Для этого необходимо выполнить несколько шагов. Во-первых, элемент управления должен иметь RenderTransform, который является TranslateTransform. Если вы не хотите задавать это в XAML, не стесняйтесь устанавливать его с помощью this. RenderTransform = новый TranslateTransform.

  6. Теперь нам нужно установить координаты X и Y на RenderTransform, чтобы элемент управления переместился в новое место. Следующий код выполняет это

    private void Header_MouseMove(отправитель объекта, MouseEventArgs e)
    {
     если (IsMoving)
     {
     Получение положения мыши относительно родительского элемента управления 
     Point MousePoint = Mouse.GetPosition(this. Родитель как IInputElement );
     установить расстояние от исходного положения
     этот. РасстояниеFromStartX= MousePoint.X - StartX - RelativeX ;
     этот. РасстояниеFromStartY= MousePoint.Y - StartY - RelativeY;
     Задайте для координат X и Y RenderTransform значение Расстояние от исходного положения. Это приведет к перемещению элемента управления
     TranslateTransform MoveTransform = база. RenderTransform как TranslateTransform;
     MoveTransform.X = это. РасстояниеСварьстартХ;
     MoveTransform.Y = это. РасстояниеСварьяСтартY;
     }
    }
    

Как вы можете догадаться, осталось немного кода (объявления переменных и т. Д.), Но это должно быть все, что вам нужно, чтобы начать :) счастливое кодирование.

ПРАВИТЬ:
Одна из проблем, с которой вы можете столкнуться, заключается в том, что это позволяет переместить элемент управления из области его родительского элемента управления. Вот быстрый и грязный код, чтобы исправить эту проблему...

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 приведет к выходу элемента управления из режима перемещения. Это означает, что пользователю нужно будет снова щелкнуть область перемещения, чтобы попытаться переместить элемент управления, поскольку он остановится на границе. Если вы хотите, чтобы элемент управления автоматически продолжал движение, просто выньте эту линию, и элемент управления вернется на курсор, как только он вернется в законную область.

9
ответ дан 5 December 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: