속도 계기판을 그리고 싶은데 기존 제공하는 기능들로 깔끔한 호를 그리기 어려워 이방법 저방법 찾아보다가 직접 그리는 방법을 선택했다.
public double Line_Thickness = 0.7;
public double ThicknessDiff= 1.7;
public double StartLine = 20;
public double PointerLineLength = 5;
public double PointerLineThickness = 4;
public int L_unit = 10;
public int S_unit = 1;
public double S_Length = 2;
public double L_Length = 7;
public int AngleRange ;
public int InitAngle;
public int ZeroPoint = 0;
public int CenterX;
public int CenterY;
public double Fontsize = 10;
public int FontMove = 0;
public int PointerAngle = 0;
public bool NumAbs = true;
public int InitAngleNumber = 0;
public void DrawARCPanel_Center(Canvas Canvas)
{
DrawARCGraduation_Center(Canvas); // 호영역
DrawARCNumber_Center(Canvas); // 숫자 부분
DrawARCPointer_Center(Canvas); // 포인터 부분
}
public void DrawARCGraduation_Center(Canvas Canvas)
{
int InitAngle_ = InitAngle;
Line[] Lines = new Line[AngleRange + 1];
for (int i = 0; i <= AngleRange; i++)
{
if (i < 360)
{
Lines[i] = new Line
{
X1 = CenterX,
Y1 = 40 - StartLine,
X2 = CenterX,
Stroke = MainLineColor
};
if (i % L_unit == 0)
{
Lines[i].StrokeThickness = Line_Thickness + ThicknessDiff;
Lines[i].Y2 = 40 - StartLine - L_Length;
if (InitAngle_ == ZeroPoint)
{
Lines[i].Stroke = ZeroPointColor;
Lines[i].StrokeThickness = Line_Thickness + ThicknessDiff;
}
Lines[i].RenderTransform = new RotateTransform(InitAngle_, CenterX, CenterY);
Canvas.Children.Add(Lines[i]);
Canvas.SetLeft(Lines[i], 10);
Canvas.SetTop(Lines[i], 10);
}
else if(i % S_unit == 0)
{
Lines[i].StrokeThickness = Line_Thickness;
Lines[i].Y2 = 40 - StartLine - S_Length;
Lines[i].Stroke = SubLineColor;
Lines[i].RenderTransform = new RotateTransform(InitAngle_, CenterX, CenterY);
Canvas.Children.Add(Lines[i]);
Canvas.SetLeft(Lines[i], 10);
Canvas.SetTop(Lines[i], 10);
}
InitAngle_++;
}
}
}
public void DrawARCNumber_Center(Canvas Canvas)
{
int InitAngle_ = InitAngle ;
// 호 영역
Line[] Lines = new Line[AngleRange + 1];
for (int i = 0; i <= AngleRange; i += L_unit)
{
if (i <360)
{
textBlock = new TextBlock();
textBlock.FontSize = Fontsize;
textBlock.TextAlignment = TextAlignment.Center;
if (NumAbs == true)
{
textBlock.Text = ((Math.Abs(InitAngleNumber + i) % 360).ToString());
}
else
{
textBlock.Text = ((InitAngleNumber + i )% 360).ToString();
}
Size size = MeasureString(textBlock.Text);
double TextWidth = size.Width;
textBlock.Foreground = TextColor;
textBlock.Margin = new Thickness(0, 0, 0, 0);
textBlock.RenderTransform = new RotateTransform(InitAngle_, TextWidth / 2, CenterY + StartLine -20 + textBlock.FontSize * 0.5 + FontMove);
Canvas.Children.Add(textBlock);
Canvas.SetLeft(textBlock, 10 + CenterX - TextWidth / 2);
Canvas.SetTop(textBlock, -StartLine + 30 - textBlock.FontSize * 0.5 - FontMove);
InitAngle_ += L_unit;
}
}
}
public void DrawARCPointer_Center(Canvas Canvas)
{
// 바늘영역
Line line = new Line();
line.Stroke = PointerColor;
line.StrokeThickness = PointerLineThickness;
line.X1 = CenterX;
line.Y1 = - StartLine + 40;
line.X2 = CenterX;
line.Y2 = - StartLine + 40 + PointerLineLength;
line.RenderTransform = new RotateTransform(PointerAngle, CenterX, CenterY);
Canvas.Children.Add(line);
Canvas.SetLeft(line, 10);
Canvas.SetTop(line, 10);
}
쉽게 적용해서 원하는 패널을 만들도록하는 하는 간단한 프로그램을 만들어 보았다