using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace FurnaceUI.Controls
{
///
/// wpf专用的辅助工具类
///
public class WpfUtils
{
///
/// 将winform的color转换为wpf的颜色信息
///
/// winform的颜色信息
/// wpf的颜色
public static Color TransMediaColor(System.Drawing.Color color)
{
return Color.FromArgb(color.A, color.R, color.G, color.B);
}
///
/// 将点进行转换
///
/// 点位
/// 点位
public static System.Drawing.PointF[] TransMediaPoints(Point[] points)
{
System.Drawing.PointF[] points1 = new System.Drawing.PointF[points.Length];
for (int i = 0; i < points.Length; i++)
{
points1[i] = new System.Drawing.PointF((float)points[i].X, (float)points[i].Y);
}
return points1;
}
///
/// 将点进行转换
///
/// 点位
/// 点位
public static Point[] TransMediaPoints(System.Drawing.Point[] points)
{
Point[] points1 = new Point[points.Length];
for (int i = 0; i < points.Length; i++)
{
points1[i] = new Point((float)points[i].X, (float)points[i].Y);
}
return points1;
}
///
/// 将点进行转换
///
/// 点位
/// 点位
public static System.Drawing.PointF[] TransMediaPoints(List points)
{
return TransMediaPoints(points.ToArray());
}
public static System.Drawing.Color TransDrawingColor(Color color)
{
return System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
}
public static Line DrawLine(Canvas canvas, Point point1, Point point2, Color color, double thickness)
{
return DrawLine(canvas, point1.X, point1.Y, point2.X, point2.Y, color, thickness);
}
public static Line DrawLine(Canvas canvas, Point point1, Point point2, Color color, double thickness, double[] dashArray)
{
return DrawLine(canvas, point1.X, point1.Y, point2.X, point2.Y, color, thickness, dashArray);
}
public static Line DrawLine(Canvas canvas, double x1, double y1, double x2, double y2, Color color, double thickness)
{
return DrawLine(canvas, x1, y1, x2, y2, new SolidColorBrush(color), thickness);
}
public static Line DrawLine(Canvas canvas, double x1, double y1, double x2, double y2, Brush brush, double thickness)
{
Line line = new Line();
line.X1 = x1;
line.Y1 = y1;
line.X2 = x2;
line.Y2 = y2;
line.StrokeThickness = thickness;
line.Stroke = brush;
canvas.Children.Add(line);
return line;
}
public static Line DrawLine(Canvas canvas, double x1, double y1, double x2, double y2, Color color, double thickness, double[] dashArray)
{
Line line = new Line();
line.X1 = x1;
line.Y1 = y1;
line.X2 = x2;
line.Y2 = y2;
line.StrokeDashArray = new DoubleCollection(dashArray);
line.StrokeThickness = thickness;
line.Stroke = new SolidColorBrush(color);
canvas.Children.Add(line);
return line;
}
public static Ellipse DrawEllipse(Canvas canvas, double x, double y, double width, double height, Color color, double thickness)
{
Ellipse ellipse = new Ellipse();
ellipse.Width = width;
ellipse.Height = height;
canvas.Children.Add(ellipse);
Canvas.SetLeft(ellipse, x);
Canvas.SetTop(ellipse, y);
ellipse.StrokeThickness = thickness;
ellipse.Stroke = new SolidColorBrush(color);
return ellipse;
}
public static Ellipse DrawEllipse(Canvas canvas, System.Drawing.RectangleF rectangle, Color color, double thickness)
{
return DrawEllipse(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color, thickness);
}
#region Fill Rectangle
public static Rectangle FillRectangle(Canvas canvas, double x, double y, double width, double height, Color color)
{
return FillRectangle(canvas, x, y, width, height, new SolidColorBrush(color));
}
public static Rectangle FillRectangle(Canvas canvas, double x, double y, double width, double height, Brush brush)
{
if (width >= 0 && height >= 0)
{
Rectangle ellipse = new Rectangle();
ellipse.Width = width;
ellipse.Height = height;
canvas.Children.Add(ellipse);
Canvas.SetLeft(ellipse, x);
Canvas.SetTop(ellipse, y);
ellipse.Fill = brush;
return ellipse;
}
return null;
}
public static Rectangle FillRectangle(Canvas canvas, System.Drawing.RectangleF rectangle, Color color)
{
return FillRectangle(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color);
}
public static Rectangle FillRectangle(Canvas canvas, System.Drawing.RectangleF rectangle, Brush brush)
{
return FillRectangle(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, brush);
}
public static Rectangle DrawRectangle(Canvas canvas, double x, double y, double width, double height, Color color, float penWidth)
{
if (width >= 0 && height >= 0)
{
Rectangle rectangle = new Rectangle();
rectangle.Width = width;
rectangle.Height = height;
rectangle.StrokeThickness = penWidth;
rectangle.Stroke = new SolidColorBrush(color);
canvas.Children.Add(rectangle);
Canvas.SetLeft(rectangle, x);
Canvas.SetTop(rectangle, y);
return rectangle;
}
return null;
}
public static Rectangle DrawRectangle(Canvas canvas, System.Drawing.RectangleF rectangle, Color color, float penWidth)
{
return DrawRectangle(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color, penWidth);
}
#endregion
#region Fill Ellipse
public static Ellipse FillEllipse(Canvas canvas, double x, double y, double width, double height, Color color)
{
return FillEllipse(canvas, x, y, width, height, new SolidColorBrush(color));
}
public static Ellipse FillEllipse(Canvas canvas, double x, double y, double width, double height, Brush brush)
{
Ellipse ellipse = new Ellipse();
ellipse.Width = width;
ellipse.Height = height;
canvas.Children.Add(ellipse);
Canvas.SetLeft(ellipse, x);
Canvas.SetTop(ellipse, y);
ellipse.Fill = brush;
return ellipse;
}
public static Ellipse FillEllipse(Canvas canvas, System.Drawing.RectangleF rectangle, Color color)
{
return FillEllipse(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color);
}
public static Ellipse FillEllipse(Canvas canvas, System.Drawing.RectangleF rectangle, Brush brush)
{
return FillEllipse(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, brush);
}
#endregion
public static Polyline DrawLines(Canvas canvas, Point[] points, Color color, double thickness, double[] dashArray = null)
{
Polyline polylines = new Polyline();
polylines.Points = new PointCollection(points);
polylines.StrokeThickness = thickness;
polylines.Stroke = new SolidColorBrush(color);
if (dashArray != null)
polylines.StrokeDashArray = new DoubleCollection(dashArray);
canvas.Children.Add(polylines);
return polylines;
}
public static void DrawLines(Canvas canvas, Point[] points, HslCurveItem line, int pointsRadius)
{
if (points.Length < 2) return;
if (line.Style == CurveStyle.LineSegment || line.Style == CurveStyle.Curve)
{
DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness);
}
else if (line.Style == CurveStyle.LineDot || line.Style == CurveStyle.CurveDot)
{
DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness, new double[] { 1, 1 });
}
else if (line.Style == CurveStyle.CurveDash || line.Style == CurveStyle.LineDash)
{
DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness, new double[] { 2, 2 });
}
else if (line.Style == CurveStyle.CurveLongDath || line.Style == CurveStyle.LineLongDath)
{
DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness, new double[] { 5, 5 });
}
else if (line.Style == CurveStyle.StepLine)
{
PointCollection collects = new PointCollection();
for (int i = 0; i < points.Length - 1; i++)
{
Point center = new Point(points[i + 1].X, points[i].Y);
collects.Add(points[i]);
collects.Add(center);
}
collects.Add(points[points.Length - 1]);
DrawLines(canvas, collects.ToArray(), WpfUtils.TransMediaColor(line.LineColor), line.LineThickness);
}
else
{
for (int i = 0; i < points.Length - 1; i++)
{
Point center = new Point(points[i + 1].X, points[i].Y);
Line line1 = new Line();
line1.X1 = points[i].X;
line1.Y1 = points[i].Y;
line1.X2 = center.X;
line1.Y2 = center.Y;
line1.StrokeThickness = line.LineThickness;
line1.Stroke = new SolidColorBrush(WpfUtils.TransMediaColor(line.LineColor));
canvas.Children.Add(line1);
}
}
if (pointsRadius > 0 && pointsRadius < 20)
{
for (int i = 0; i < points.Length; i++)
{
FillEllipse(canvas, points[i].X - pointsRadius, points[i].Y - pointsRadius, pointsRadius * 2, pointsRadius * 2, WpfUtils.TransMediaColor(line.LineColor));
}
}
}
public static Path DrawCurve(Canvas canvas, Point[] points, Color color, double thickness)
{
Path path = new Path();
path.StrokeThickness = thickness;
path.Stroke = new SolidColorBrush(color);
canvas.Children.Add(path);
return path;
}
public static Polygon FillPolygon(Canvas canvas, Point[] points, Color color)
{
return FillPolygon(canvas, points, new SolidColorBrush(color));
}
public static Polygon FillPolygon(Canvas canvas, Point[] points, Brush brush)
{
Polygon polygon = new Polygon();
polygon.Points = new PointCollection(points);
polygon.Fill = brush;
canvas.Children.Add(polygon);
return polygon;
}
public static Polygon DrawPolygon(Canvas canvas, Point[] points, Color color, float penWidth)
{
Polygon polygon = new Polygon();
polygon.Points = new PointCollection(points);
polygon.StrokeThickness = penWidth;
polygon.Stroke = new SolidColorBrush(color);
canvas.Children.Add(polygon);
return polygon;
}
public static Polygon FillTriangle(Canvas canvas, Point point, Color color, int size, GraphDirection direction)
{
Point[] points = new Point[4];
if (direction == GraphDirection.Leftward)
{
points[0] = new Point(point.X, point.Y - size);
points[1] = new Point(point.X, point.Y + size);
points[2] = new Point(point.X - 2 * size, point.Y);
}
else if (direction == GraphDirection.Rightward)
{
points[0] = new Point(point.X, point.Y - size);
points[1] = new Point(point.X, point.Y + size);
points[2] = new Point(point.X + 2 * size, point.Y);
}
else if (direction == GraphDirection.Upward)
{
points[0] = new Point(point.X - size, point.Y);
points[1] = new Point(point.X + size, point.Y);
points[2] = new Point(point.X, point.Y - 2 * size);
}
else
{
points[0] = new Point(point.X - size, point.Y);
points[1] = new Point(point.X + size, point.Y);
points[2] = new Point(point.X, point.Y + 2 * size);
}
points[3] = points[0];
return FillPolygon(canvas, points, color);
}
public static void DrawString(Canvas canvas, string text, Color color, System.Drawing.RectangleF rectangle, HorizontalAlignment horizontal, VerticalAlignment vertical)
{
DrawString(canvas, text, color, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, horizontal, vertical);
}
public static void DrawString(Canvas canvas, string text, Brush brush, System.Drawing.RectangleF rectangle, HorizontalAlignment horizontal, VerticalAlignment vertical)
{
DrawString(canvas, text, brush, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, horizontal, vertical);
}
public static void DrawString(Canvas canvas, string text, Color color, double x, double y, double width, double height, HorizontalAlignment horizontal, VerticalAlignment vertical)
{
DrawString(canvas, text, new SolidColorBrush(color), x, y, width, height, horizontal, vertical);
}
public static void DrawString(Canvas canvas, string text, Brush foreground, double x, double y, double width, double height, HorizontalAlignment horizontal, VerticalAlignment vertical)
{
Label label = new Label();
label.Width = width;
label.Height = height;
label.Foreground = foreground;
label.HorizontalContentAlignment = horizontal;
label.VerticalContentAlignment = vertical;
label.Content = text;
canvas.Children.Add(label);
label.Style = null;
Canvas.SetLeft(label, x);
Canvas.SetTop(label, y);
}
public static void DrawString(Canvas canvas, string text, Brush foreground, double fontSize, double x, double y, double width, double height, HorizontalAlignment horizontal, VerticalAlignment vertical)
{
Label label = new Label();
label.Width = width;
label.Height = height;
label.FontSize = fontSize;
label.Foreground = foreground;
label.HorizontalContentAlignment = horizontal;
label.VerticalContentAlignment = vertical;
label.Content = text;
canvas.Children.Add(label);
Canvas.SetLeft(label, x);
Canvas.SetTop(label, y);
}
}
}