2014-10-24 3 views
0

Мне нужно реализовать функцию перемещения newLine_MouseMove, так что я мог с помощью мыши, чтобы переместить линию вокруг холста, а не только в нижнем правом углу, как показано на Code:Перемещение строки в WPF

enter image description here

Код:

private void newLine_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (Mouse.LeftButton == MouseButtonState.Pressed) //Movement only when the key is pressed 
    { 
     if (ExitLine()) //The function returns a value true, if the line is within the Canvas. 
     { 
      if (selectedLine != null) //If you select a line 
      { 
       //???????????????????? 
       /* 
       selectedLine.X1 += 1; 
       selectedLine.Y1 += 1; 
       selectedLine.X2 += 1; 
       selectedLine.Y2 += 1; 
       */ 
      } 
     } 
    } 
} 

Очень хотелось бы, чтобы получить подробный ответ.

спасибо.

+2

Что такое «перемешанная плавная линия»? Что должен делать этот код? Вы действительно хотите, чтобы линия двигалась по диагонали до нижнего правого, пока ваш метод 'ExitLine()' возвращает 'true'? Для «подробного ответа» я настоятельно рекомендую подробный вопрос. Оба обычно идут рука об руку. –

+0

Этот пример кода перемещает строку в нижнем правом углу, и мне нужно выйти за пределы линии мыши на весь экран рабочего стола. –

+0

Если вы хотите, чтобы движение следовало за мышью, вам нужно использовать координаты мыши (доступные в объекте 'MouseEventArgs'). Обычно это означает сохранение координат при первом нажатии кнопки мыши, а затем использование разницы между текущей позицией и этой начальной позицией для определения фактического изменения положения или границы объекта. Но без лучшего вопроса невозможно точно знать, что сработает для вас. Что такое 'ExitLine()'? Почему вы только перемещаете объект, когда возвращается 'true'? –

ответ

2

Этот код отлично работает для меня. Вам нужно будет изменить некоторые из кода в разделе <Window>, но оставить MouseMove="" определение есть:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="525" Width="525" 
     MouseMove="Line_MouseMove"> 

    <Line Name="L1" X2="50" Y2="50" Stroke="Red" StrokeThickness="1" /> 

</Window> 

Это определение Line_MouseMove:

private void Line_MouseMove(object sender, MouseEventArgs e) 
{ 
    L1.X2 = L1.X2 - L1.X1 + e.GetPosition(L1).X; 
    L1.Y2 = L1.Y2 - L1.Y1 + e.GetPosition(L1).Y; 
    L1.X1 = e.GetPosition(L1).X; 
    L1.Y1 = e.GetPosition(L1).Y; 
} 

Это то, что здесь происходит. Этот код создает строку: <Line ... />. Когда ваша мышь перемещается по окну, окно вызывает событие MouseMove, которое вызывает метод Line_MouseMove. Метод Line_MouseMove добавляет положение курсора относительно строки в координаты X и Y, который поддерживает длину и угол линии, но сохраняет начальное положение линии одинаково. Чтобы изменить длину и угол линии, просто измените значения X2 и Y2.

Если необходимо ограничить строку в определенной области, заменить Line_MouseMove с этим:

private void Line_MouseMove(object sender, MouseEventArgs e) 
{ 
    // create limited rectangle 
    Rect rr = new Rect(100, 50, 60, 400); 

    // check if both ends of the line are fully contained within the rectangle 
    if (rr.Contains(e.GetPosition(L1).X, e.GetPosition(L1).Y) && rr.Contains(e.GetPosition(L1).X + L1.X2 - L1.X1, e.GetPosition(L1).Y + L1.Y2 - L1.Y1)) 
    { 
     // change the line's position 
     L1.X2 = L1.X2 - L1.X1 + e.GetPosition(L1).X; 
     L1.Y2 = L1.Y2 - L1.Y1 + e.GetPosition(L1).Y; 
     L1.X1 = e.GetPosition(L1).X; 
     L1.Y1 = e.GetPosition(L1).Y; 
    } 
} 

Заменить координаты в Rect(0, 0, 200, 200) с координатами, которые вы хотите - вы, возможно, потребуется рассчитать их на основе размера окна ,

Вышеупомянутое решение позволяет концу линии исчезнуть с указанной области.

+0

Я сомневаюсь, что обработка события 'MouseMove'' Line' не будет работать должным образом. Особенно, когда вы пытаетесь перемещать линию как можно быстрее. –

+0

@KingKing Я не уверен, что вы имеете в виду здесь. Обработка 'MouseMove' в' Line' не работает, но обработка его в 'Window' действительно работает. – Hosch250

+0

Ну, имя обработчика на самом деле обмануло меня. его имя - 'Line_MouseMove', но на самом деле это обработчик' MouseMove' 'Window'. Так что, конечно, это работает. –

Смежные вопросы