一、缩放和平移
Canvas的坐标系统 坐标原点默认是左上角,Y轴正向朝下,不太符合习惯,通过设置变换矩阵进行调整。
Reset()函数中添加以下代码
public void Reset()
{
Zoomfactor = 1.1f;
TransformGroup tg = this.RenderTransform as TransformGroup;
if(tg == null)
{
tg = new TransformGroup();
this.RenderTransform = tg;
}
tg.Children.Clear();
tg.Children.Add(new ScaleTransform(-1, 1));
tg.Children.Add(new SkewTransform());
tg.Children.Add(new RotateTransform(180));
tg.Children.Add(new TranslateTransform(0, this.ActualHeight));
foreach (UIElement child in this.Children)
{
child.RenderTransform = Transform.Identity;
iDrawingVisualSignal iDrawing = child as iDrawingVisualSignal;
Canvas.SetTop(child, iDrawing.ptBase.X);
Canvas.SetLeft(child, iDrawing.ptBase.Y);
}
}
坐标系变换后,绘制的文本是倒着的
因此,需要在绘制文本前,设置DrawingContext的变换矩阵,修改后的OnRender函数如下
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
Pen pen1 = new Pen(bSelected || bHit ? Brushes.White : Brushes.Red, bSelected || bHit ? 4f : 1f);
pen1.Freeze(); //冻结画笔,这样能加快绘图速度
drawingContext.DrawLine(pen1, new Point(0, 0), ptConnect);
drawingContext.DrawLine(pen1, new Point(0, 0), new Point(ptConnect.X, 50));
FormattedText text = new FormattedText("S1", CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Tahoma"), 16 * 1, Brushes.White, 1);
double de = text.Width / 2.0;
double dew = text.Height + 4;
// 设置变换矩阵
ScaleTransform scale= new ScaleTransform(1,-1);
drawingContext.PushTransform(scale);
Point ptT = new Point(ptConnect.X / 2 - de, -dew);
drawingContext.DrawText(text, ptT);
}