using System.ComponentModel;
using System.Windows;
using System.Windows.Media;
using static Bro.Common.Helper.EnumHelper;
namespace Bro.Common.ImageCanvas.Shapes
{
public abstract class ShapeElementBase : DrawingVisual, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int Index { get; set; }
#region Draw
public void Draw()
{
if (Pen == null)
{
SetNormalPen();
}
//Application.Current.Dispatcher.Invoke(() =>
//{
using (DrawingContext dc = RenderOpen())
{
DrawShape(dc);
}
//});
}
protected abstract void DrawShape(DrawingContext dc);
#endregion
#region 画笔相关
#region 绘图画笔
private Pen pen = null;
public Pen Pen
{
get => pen;
set => SetAndDraw(ref pen, value);
}
public virtual void SetNormalPen()
{
Pen = new Pen(new SolidColorBrush(Colors.Black), 3);
}
public virtual void SetHoverPen()
{
Pen = new Pen(new SolidColorBrush(Colors.BlueViolet), 10);
}
public virtual void SetInSidePen()
{
Pen = new Pen(new SolidColorBrush(Colors.YellowGreen), 6);
}
public virtual void SetSelectedPen()
{
Pen = new Pen(new SolidColorBrush(Colors.Pink), 10);
}
protected virtual void SetMeasureDoneOKPen()
{
Pen = new Pen(new SolidColorBrush(Colors.Green), 6);
}
protected virtual void SetMeasureDoneNGPen()
{
Pen = new Pen(new SolidColorBrush(Colors.Red), 6);
}
protected virtual void SetMeasuringPen()
{
Pen = new Pen(new SolidColorBrush(Colors.Yellow), 3);
}
#endregion
#region 文字画笔
///
/// 字体大小
///
public virtual float FontSize { get; set; } = 30;
///
/// 字体和基元的距离
///
public virtual int FontDistance { get; set; } = 5;
public virtual bool IsShowRemark { get; set; } = true;
public string Text { get; set; }
public virtual Typeface Typeface { get; set; } = new Typeface(new FontFamily("宋体"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
#endregion
#endregion
#region 鼠标位置判断
protected abstract bool IsMouseInSide(Point point);
protected abstract bool IsMouseHover(Point point);
#endregion
#region 状态
private ElementState state = ElementState.New;
public ElementState State
{
get
{
return state;
}
set
{
if (state != value)
{
state = value;
switch (state)
{
case ElementState.MouseHover:
SetHoverPen();
break;
case ElementState.MouseInSide:
SetInSidePen();
break;
case ElementState.Selected:
SetSelectedPen();
break;
case ElementState.Normal:
SetNormalPen();
break;
case ElementState.Measuring:
SetMeasuringPen();
break;
case ElementState.MeasureDoneOK:
SetMeasureDoneOKPen();
break;
case ElementState.MeasureDoneNG:
SetMeasureDoneNGPen();
break;
}
}
}
}
///
/// 是否是运行模式
///
[Browsable(false)]
public RunMode RunMode { get; set; } = RunMode.SetMode;
public virtual void CheckMouseState(Point point)
{
if (State != ElementState.Selected)
{
if (IsMouseInSide(point))
{
State = ElementState.MouseInSide;
}
else if (IsMouseHover(point))
{
State = ElementState.MouseHover;
}
else
{
State = ElementState.Normal;
}
}
}
#endregion
#region 变化导致重绘事件
protected void SetAndDraw(ref T field, T value)
{
if (value != null)
{
if (!value.Equals(field))
{
field = value;
Draw();
}
}
}
#endregion
}
}