Вопрос по wpf, vb.net – Слишком тонкая линия рабочего процесса дизайнера

1

Я делаю конструктор рабочих процессов для создания рабочих процессов на холсте с помощью wpf и vb.net. Я сделал возможным рисовать линии (отношения) между объектами с хорошей функцией. Теперь я хочу реализовать способ удалить отношение. Я добавляю обработчик onclick к форме, но линия очень тонкая и трудно щелкает. Я слышал, чтобы нарисовать 2 линии 1 с более толстой толщиной хода, но это невозможно, поскольку метод вытяжной линии является тяжелым для процессора.

Спасибо за помощь

Дэвид

Ваш Ответ

2   ответа
3

ов Shape, а затем сделатьТестирование попаданий в визуальном слое (хотя API немного странно) спроверка геометрии ударанапример эллипс. Холст должен иметь свойBackground установить (например, вTransparent) получать события мыши.

Извините, что это C #, но я не говорю на VB:

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Canvas canvas = sender as Canvas;
    EllipseGeometry hitTestGeometry =
        new EllipseGeometry(e.GetPosition(canvas), 10d, 10d);
    Shape hitShape = null;

    HitTestResultCallback hitTestCallback =
        result =>
        {
            hitShape = result.VisualHit as Shape;
            return hitShape != null ? HitTestResultBehavior.Stop : HitTestResultBehavior.Continue;
        };

    VisualTreeHelper.HitTest(canvas, null, hitTestCallback, new GeometryHitTestParameters(hitTestGeometry));

    if (hitShape != null)
    {
        System.Diagnostics.Trace.TraceInformation("hit shape: {0}", hitShape);
    }
}

EDIT:

Вот эквивалентный код VB. VB не поддерживает многострочные лямбда-выражения, поэтому обратный вызов проверки нажатия должен быть объявлен явно

Private Function htCallback(ByVal result As HitTestResult) _
 As HitTestResultBehavior
    Dim hitShape As Shape = Nothing
    hitShape = TryCast(result.VisualHit, Shape)
    If hitShape IsNot Nothing Then
        'do something 
    End If
    Return If(hitShape IsNot Nothing, HitTestResultBehavior.[Stop], _
      HitTestResultBehavior.[Continue])
End Function


Private Sub Canvas_MouseLeftButtonDown(ByVal sender As Object, _
  ByVal e As MouseButtonEventArgs) Handles Canvas1.MouseRightButtonDown
    Dim canvas As Canvas = TryCast(sender, Canvas)
    Dim hitTestGeometry As New EllipseGeometry(e.GetPosition(canvas), 10.0, 10.0)
    Dim hitTestCallback As HitTestResultCallback = _
      New HitTestResultCallback(AddressOf htCallback)
    VisualTreeHelper.HitTest(canvas, Nothing, hitTestCallback, _
      New GeometryHitTestParameters(hitTestGeometry))
End Sub
У теста удара есть лучшая производительность чем использование метода, описанного ниже? DavidVdd
отредактировано, чтобы добавить код VB для вышеупомянутого, ожидая одобрения;)
@J ... Спасибо за редактирование. Я никогда не пойму, как вы можете добровольно использовать этот язык :-)
@DavidVdd - с помощью теста попадания вы можете указать, насколько большую область вокруг мыши вы хотите найти для линии (здесь это эллипс 10x10), чтобы вы могли иметь большую область допуска, не делая линию слишком большой. Они оба - быстрые / легкие операции, в любом случае, я не думаю, что вы должны почувствовать снижение производительности от них.
@DavidVdd - однако это не делает для вас обратной связи, как и другой метод. Вы можете поставить тест на попадание вMouseMove обработчик событий, однако, и объединить обе идеи. Это будет постоянно выполнять тесты попадания, пока мышь перемещается по холсту, однако, это добавит некоторую дополнительную нагрузку на обработку. Попробуйте и убедитесь, что это лучший способ, я думаю.
2

простой ответ, но когда вы добавите новую строку на холст, вы можете сделать что-то вроде

AddHandler myLine.MouseEnter, AddressOf lineHover
AddHandler myLine.MouseLeave, AddressOf lineLeave
AddHandler myLine.MouseDown, AddressOf lineDelete
Canvas1.Children.Add(myLine)

где

Private Sub lineHover(ByVal sender As Object, ByVal e As MouseEventArgs)
    CType(sender, Line).StrokeThickness = 3
End Sub

Private Sub lineLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
    CType(sender, Line).StrokeThickness = 1
End Sub

Private Sub lineDelete(ByVal sender As Object, ByVal e As MouseEventArgs)
    Canvas1.Children.Remove(CType(sender, Line))
End Sub

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

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