Этот код отлично работает для меня. Вам нужно будет изменить некоторые из кода в разделе <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)
с координатами, которые вы хотите - вы, возможно, потребуется рассчитать их на основе размера окна ,
Вышеупомянутое решение позволяет концу линии исчезнуть с указанной области.
Что такое «перемешанная плавная линия»? Что должен делать этот код? Вы действительно хотите, чтобы линия двигалась по диагонали до нижнего правого, пока ваш метод 'ExitLine()' возвращает 'true'? Для «подробного ответа» я настоятельно рекомендую подробный вопрос. Оба обычно идут рука об руку. –
Этот пример кода перемещает строку в нижнем правом углу, и мне нужно выйти за пределы линии мыши на весь экран рабочего стола. –
Если вы хотите, чтобы движение следовало за мышью, вам нужно использовать координаты мыши (доступные в объекте 'MouseEventArgs'). Обычно это означает сохранение координат при первом нажатии кнопки мыши, а затем использование разницы между текущей позицией и этой начальной позицией для определения фактического изменения положения или границы объекта. Но без лучшего вопроса невозможно точно знать, что сработает для вас. Что такое 'ExitLine()'? Почему вы только перемещаете объект, когда возвращается 'true'? –