Какие существуют разные методы для перетаскивания объектов без использования горизонтального или вертикального выравнивания, установленного влево и вверх - PullRequest
3 голосов
/ 02 декабря 2010

Я занимаюсь разработкой приложения Dashboard, в котором я хотел бы, чтобы пользователь мог изменять размеры и перемещать свои виджеты диаграмм туда, где им удобно.У меня были проблемы с возможностью двигаться и изменять размер одновременно.Причина в том, что когда выравнивания диаграммы установлены на следующее:

chart.HorizontalAlignment = HorizontalAlignment.Left;
chart.VerticalAlignment = VerticalAlignment.Top;

... движение будет работать отлично, однако изменение размера сойдет с ума в необнаружимых направлениях.Если я переключу выравнивание на следующее:

chart.HorizontalAlignment = HorizontalAlignment.Stretch;
chart.VerticalAlignment = VerticalAlignment.Stretch;

... перемещение будет отключено, но изменение размера будет работать прилично.

Код перемещения будет следующим:

public void chart_MouseMove(object sender, MouseEventArgs e)
{
    C1Chart chart = sender as C1Chart;

       if (!ModifierKey)
       {
           if (isMouseCaptured)
           {
               // Calculate the current position of the object.
               double deltaV = e.GetPosition(null).Y - mouseVerticalPosition;
               double deltaH = e.GetPosition(null).X - mouseHorizontalPosition;
               double newTop = deltaV + (double)chart.Margin.Top;
               double newLeft = deltaH + (double)chart.Margin.Left;

               // Set new position of object.            
               chart.Margin = new Thickness(newLeft, newTop, 0, 0); 

               // Update position global variables.
               mouseVerticalPosition = e.GetPosition(null).Y;
               mouseHorizontalPosition = e.GetPosition(null).X;
          }
      }
}

mouseVerticalPosition, mouseHorizontPosition, isMouseCaptured назначаются в событии мыши на диаграмме, а ModifierKey является логическим значением, чтобы указать, нажата ли какая-либо из модификаторов клавиатуры, чтобы узнать, перемещаться или нет.Этот код был взят из MSDN, но я открыт для альтернативных решений.

Код изменения размера можно найти здесь (пример Microsoft) или здесь (блог Дениса Вуйки) .Вот мой вопрос: Существуют ли другие способы перетаскивания и перемещения или изменения размера (класс Adorner), которых я не вижу.Или есть способ использовать этот код с хаком выравнивания.

1 Ответ

0 голосов
/ 03 декабря 2010

Вы смотрели в MouseDragElementBehavior? http://blogs.msdn.com/b/dphill/archive/2009/09/25/blend-behaviors.aspx

...