好的,下面是我的长代码,主要是直接来自MSDN网站..
如果您使用此代码,您可以在多个位置左键单击窗口,然后右键单击并绘制一条线,连接您左键单击的每个点。您可以根据需要多次重复此操作。
我想知道如何使用drawingVisual在您点击并在窗口上/上移动鼠标时主动显示该行..
我实际上知道如何做到这一点,但没有使用drawingVisual ..请参阅我之前在Line drawing with instant response to mouse movement?的问题中的代码
我想知道唯一的方法是将这两种方法一起添加吗?或者是否有更好的方法,只使用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;
}
}