Как сделать так, чтобы текущая линия отображалась на экране? - PullRequest
0 голосов
/ 18 марта 2012

Хорошо, ниже приведен мой длинный код, который в основном прямо с веб-сайта MSDN.

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

Я хотел бы знать, как использовать DrawingVisual, чтобы активно отображать линию при нажатии и перемещениимышь на / над окном ..

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

Я хочу знать, если единственный способ состоит в том, чтобы добавить эти 2 метода вместе?Или есть лучший способ сделать это, используя только DrawingVisual или другой?

Я не эксперт и не учусь на ходу, так что извините, если я прошу много ..

Спасибо

public class MyVisualHost : FrameworkElement
{
    // Create a collection of child visual objects.
    private DrawingVisual drawingVisual;
    private DrawingContext drawingContext;
    private VisualCollection _children;

    Point pt1, pt2;
    Pen pen;

    bool dc_status;

    public MyVisualHost()
    {
        dc_status = false;
        pen = new Pen(Brushes.Black, 3);

        _children = new VisualCollection(this);
        _children.Add(CreateDrawingVisualRectangle(new Point(0,0), new Size(500,500)));

        // Add the event handler for MouseLeftButtonUp.
        this.MouseLeftButtonDown += new MouseButtonEventHandler(MyVisualHost_MouseLeftButtonDown);
        this.MouseMove += new MouseEventHandler(MyVisualHost_MouseMove);
        this.MouseLeftButtonUp += new MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
        this.MouseRightButtonUp += new MouseButtonEventHandler(MyVisualHost_MouseRightButtonUp);
    }

    // Create a DrawingVisual that contains a rectangle.
    private DrawingVisual CreateDrawingVisualRectangle(Point pt, Size sz)
    {
        drawingVisual = new DrawingVisual();
        drawingContext = drawingVisual.RenderOpen();
        Rect rect = new Rect(pt, sz);
        drawingContext.DrawRectangle(Brushes.LightBlue, (Pen)null, rect);
        drawingContext.Close();

        return drawingVisual;
    }

    // Provide a required override for the VisualChildrenCount property.
    protected override int VisualChildrenCount
    {
        get { return _children.Count; }
    }

    // Provide a required override for the GetVisualChild method.
    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= _children.Count)
        {
            throw new ArgumentOutOfRangeException();
        }
        return _children[index];
    }

    // Create a DrawingVisual that contains a line.
    private DrawingVisual CreateDrawingVisualLine(Point pt1, Point pt2)
    {
        drawingVisual = new DrawingVisual();
        drawingContext = drawingVisual.RenderOpen();
        drawingContext.DrawLine(pen, pt1, pt2);
        drawingContext.Close();
        return drawingVisual;
    }

    void MyVisualHost_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (!dc_status)
        {
            dc_status = true;

            pt1 = e.GetPosition((UIElement)sender);

            drawingVisual = new DrawingVisual();
            drawingContext = drawingVisual.RenderOpen();
        }
    }

    void MyVisualHost_MouseMove(object sender, MouseEventArgs e)
    {
        pt2 = e.GetPosition((UIElement)sender);
    }

    void MyVisualHost_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (dc_status)
        {
            drawingContext.DrawLine(pen, pt1, pt2);
        }
        pt1 = e.GetPosition((UIElement)sender);
    }

    // Capture the mouse event and hit test the coordinate point value against
    // the child visual objects.
    void MyVisualHost_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (dc_status)
        {
            drawingContext.Close();
            _children.Add(drawingVisual);
            dc_status = false;
        }

        // Retreive the coordinates of the mouse button event.
        Point pt = e.GetPosition((UIElement)sender);

        // Initiate the hit test by setting up a hit test result callback method.
        VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(myCallback), new PointHitTestParameters(pt));
    }

    // If a child visual object is hit, toggle its opacity to visually indicate a hit.
    public HitTestResultBehavior myCallback(HitTestResult result)
    {
        if (result.VisualHit.GetType() == typeof(DrawingVisual))
        {
            if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
            {
                ((DrawingVisual)result.VisualHit).Opacity = 0.2;
            }
            else
            {
                ((DrawingVisual)result.VisualHit).Opacity = 1.0;
            }
        }

        // Stop the hit test enumeration of objects in the visual tree.
        return HitTestResultBehavior.Stop;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...