Хорошо, ниже приведен мой длинный код, который в основном прямо с веб-сайта 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;
}
}