using ComPDFKit.PDFAnnotation; using ComPDFKitViewer; using ComPDFKitViewer.AnnotEvent; using PDF_Office.Helper; using PDF_Office.Model; using PDF_Office.ViewModels.Tools; using Prism.Commands; using Prism.Mvvm; using Prism.Regions; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Media; namespace PDF_Office.ViewModels.PropertyPanel.AnnotPanel { public class DashStyleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is DashStyle) { var dash = value as DashStyle; if (dash.Dashes == null || dash.Dashes.Count == 0 || dash.Dashes[0] == 0) { return DashStyles.Solid.Dashes; } else { DashStyle dashx = new DashStyle(); dashx.Dashes.Add(1); dashx.Dashes.Add(1); return dashx.Dashes; } } return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class SharpsAnnotPropertyViewModel : BindableBase, INavigationAware { #region 属性 private AnnotArgsType annotType; public AnnotArgsType AnnotType { get { return annotType; } set { SetProperty(ref annotType, value); SetAnnotType(); } } private string annotTypeTitle; public string AnnotTypeTitle { get { return annotTypeTitle; } set { SetProperty(ref annotTypeTitle, value); } } private Brush selectColor = new SolidColorBrush(Colors.Transparent); public Brush SelectColor { get { return selectColor; } set { SetProperty(ref selectColor, value); AnnotEvent?.UpdateAttrib(AnnotAttrib.Color, (selectColor as SolidColorBrush).Color); AnnotEvent?.UpdateAnnot(); } } private Brush fillColor = new SolidColorBrush(Colors.Transparent); public Brush FillColor { get { return fillColor; } set { SetProperty(ref fillColor, value); AnnotEvent?.UpdateAttrib(AnnotAttrib.FillColor, (fillColor as SolidColorBrush).Color); AnnotEvent?.UpdateAnnot(); } } private double borderOpacity = 1; public double BorderOpacity { get { return borderOpacity; } set { SetProperty(ref borderOpacity, value); } } private double fillOpacity = 1; public double FillOpacity { get { return fillOpacity; } set { SetProperty(ref fillOpacity, value); } } private double lineWidth = 1; public double LineWidth { get { return lineWidth; } set { SetProperty(ref lineWidth, value); if (annotType == AnnotArgsType.AnnotLine) AnnotEvent?.UpdateAttrib(AnnotAttrib.Thickness, lineWidth); else AnnotEvent?.UpdateAttrib(AnnotAttrib.Thickness, lineWidth); AnnotEvent?.UpdateAnnot(); } } private Geometry dataPath = null; public Geometry DataPath { get { return dataPath; } set { SetProperty(ref dataPath, value); } } private DashStyle dash = new DashStyle(); public DashStyle Dash { get { return dash; } set { SetProperty(ref dash, value); if(dash.Dashes != null && dash.Dashes.Count > 0) { if (dash.Dashes[0] == 0) { AnnotEvent?.UpdateAttrib(AnnotAttrib.LineStyle, DashStyles.Solid); } else { AnnotEvent?.UpdateAttrib(AnnotAttrib.LineStyle, dash); } } else { AnnotEvent?.UpdateAttrib(AnnotAttrib.LineStyle, DashStyles.Solid); } AnnotEvent?.UpdateAnnot(); } } #endregion public DelegateCommand SelectedThickCommand { get; set; } public DelegateCommand SelectedColorCommand { get; set; } public DelegateCommand SelectedFillOpacityCommand { get; set; } public DelegateCommand SelectedFillColorCommand { get; set; } public DelegateCommand LineStyleCommand { get; set; } public DelegateCommand SharpsTypeCommand { get; set; } public DelegateCommand ThicknessChangedCommand { get; set; } public event EventHandler LoadPropertyHandler; public SharpsAnnotPropertyViewModel() { SelectedThickCommand = new DelegateCommand(SelectedThick_Command); SelectedColorCommand = new DelegateCommand(SelectedColor_Command); SelectedFillOpacityCommand = new DelegateCommand(SelectedFillOpacity_Command); SelectedFillColorCommand = new DelegateCommand(SelectedFillColor_Command); LineStyleCommand = new DelegateCommand(LineStyle_Command); SharpsTypeCommand = new DelegateCommand(SharpsType_Command); ThicknessChangedCommand = new DelegateCommand(ThicknessChanged_Command); } private void ThicknessChanged_Command(object obj) { if (obj != null) { var item = (ComboBoxItem)obj; var content = (string)item.Content; if (content != null) { var intData = int.Parse(content); LineWidth = intData; } } } private void SharpsType_Command(object obj) { if(obj != null) { var tag = (string)obj; SharpsType(tag); } } private void SharpsType(string tag,bool isFromToolsBtn = false) { Dictionary changeData = new Dictionary(); switch (tag) { case "Rect": RectangleGeometry rectPath = new RectangleGeometry(); rectPath.Rect = new Rect(0, 5, 28, 22); DataPath = rectPath; changeData[AnnotArgsType.AnnotSquare] = tag; break; case "Circle": EllipseGeometry circlePath = new EllipseGeometry(); circlePath.RadiusX = 14; circlePath.RadiusY = 14; circlePath.Center = new Point(14, 14); DataPath = circlePath; changeData[AnnotArgsType.AnnotCircle] = tag; break; case "Arrow": { ArrowHelper arrowLine = new ArrowHelper(); arrowLine.ArrowLength = 8; arrowLine.LineStart = new Point(8, 24); arrowLine.LineEnd = new Point(24, 8); arrowLine.StartSharp = C_LINE_TYPE.LINETYPE_NONE; arrowLine.EndSharp = C_LINE_TYPE.LINETYPE_ARROW; DataPath = arrowLine.BuildArrowBody(); changeData[AnnotArgsType.AnnotLine] = tag; // changeData[AnnotArgsType.AnnotLine] = tag; } break; case "Line": { ArrowHelper arrowLine = new ArrowHelper(); arrowLine.LineStart = new Point(0, 32); arrowLine.LineEnd = new Point(32, 0); DataPath = arrowLine.BuildArrowBody(); changeData[AnnotArgsType.AnnotLine] = tag; } break; } if (isFromToolsBtn == false) PropertyPanel.AnnotTypeChangedInvoke(this, changeData); } private void LineStyle_Command(object obj) { if(obj!= null) { var tag = obj as string; if(tag == "Solid") { DashStyle dashAnnot = new DashStyle(); dashAnnot.Dashes.Add(0); dashAnnot.Dashes.Add(0); Dash = dashAnnot; } else { DashStyle dashAnnot = new DashStyle(); dashAnnot.Dashes.Add(1); dashAnnot.Dashes.Add(1); Dash = dashAnnot; } } } private void SelectedFillColor_Command(object obj) { if (obj != null) { var colorValue = (Color)obj; if (colorValue != null) { FillColor = new SolidColorBrush(colorValue); FillColor.Opacity = FillOpacity; Dictionary changeData = new Dictionary(); changeData[AnnotArgsType.AnnotFreehand] = obj; PropertyPanel.DataChangedInvoke(this, changeData); } } } private void SelectedFillOpacity_Command(object obj) { if (obj != null) { FillOpacity = (double)obj; SelectColor.Opacity = FillOpacity; AnnotEvent?.UpdateAttrib(AnnotAttrib.Transparency, FillOpacity); AnnotEvent?.UpdateAnnot(); Dictionary changeData = new Dictionary(); changeData[AnnotArgsType.AnnotFreehand] = FillOpacity; PropertyPanel.DataChangedInvoke(this, changeData); } } private void SelectedColor_Command(object obj) { if (obj != null) { var colorValue = (Color)obj; if (colorValue != null) { SelectColor = new SolidColorBrush(colorValue); SelectColor.Opacity = FillOpacity; Dictionary changeData = new Dictionary(); changeData[AnnotArgsType.AnnotFreehand] = obj; PropertyPanel.DataChangedInvoke(this, changeData); } } } private void SelectedThick_Command(object obj) { if (obj is double) { var tran = (double)obj; BorderOpacity = tran; SelectColor.Opacity = tran; AnnotEvent?.UpdateAttrib(AnnotAttrib.Transparency, tran); AnnotEvent?.UpdateAnnot(); } } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { } private void SetAnnotType() { switch (AnnotType) { case AnnotArgsType.AnnotCircle: AnnotTypeTitle = "圆"; break; case AnnotArgsType.AnnotSquare: AnnotTypeTitle = "矩形"; break; case AnnotArgsType.AnnotLine: var annotLine = Annot as LineAnnotArgs; if (annotLine != null) { if (annotLine.TailLineType == C_LINE_TYPE.LINETYPE_ARROW && annotLine.HeadLineType == C_LINE_TYPE.LINETYPE_NONE) AnnotTypeTitle = "箭头"; else AnnotTypeTitle = "线"; } break; } } public AnnotAttribEvent AnnotEvent { get; set; } private AnnotHandlerEventArgs Annot; private AnnotPropertyPanel PropertyPanel; public void OnNavigatedTo(NavigationContext navigationContext) { navigationContext.Parameters.TryGetValue(ParameterNames.PropertyPanelContentViewModel, out PropertyPanel); if (PropertyPanel != null) { AnnotEvent = PropertyPanel.AnnotEvent; AnnotType = PropertyPanel.annot.EventType; Annot = PropertyPanel.annot; GetAnnotProperty(); LoadPropertyHandler?.Invoke(null, Annot); } } private void GetAnnotProperty() { if (Annot != null) { switch (Annot.EventType) { case AnnotArgsType.AnnotSquare: if (Annot is SquareAnnotArgs) { var Square = Annot as SquareAnnotArgs; SelectColor = new SolidColorBrush(Square.LineColor); FillColor = new SolidColorBrush(Square.BgColor); BorderOpacity = Square.Transparency; FillOpacity = Square.Transparency; LineWidth = Square.LineWidth; Dash = Square.LineDash; SharpsType("Rect",true); } break; case AnnotArgsType.AnnotCircle: if (Annot is CircleAnnotArgs) { var Circle = Annot as CircleAnnotArgs; SelectColor = new SolidColorBrush(Circle.LineColor); FillColor = new SolidColorBrush(Circle.BgColor); BorderOpacity = Circle.Transparency; FillOpacity = Circle.Transparency; LineWidth = Circle.LineWidth; Dash = Circle.LineDash; SharpsType("Circle", true); } break; case AnnotArgsType.AnnotLine: if (Annot is LineAnnotArgs) { var line = Annot as LineAnnotArgs; SelectColor = new SolidColorBrush(line.LineColor); FillColor = new SolidColorBrush(line.LineColor); BorderOpacity = line.Transparency; FillOpacity = line.Transparency; LineWidth = line.LineWidth; Dash = line.LineDash; if (line.TailLineType == C_LINE_TYPE.LINETYPE_ARROW && line.HeadLineType == C_LINE_TYPE.LINETYPE_NONE) SharpsType("Arrow", true); else SharpsType("Line", true); } break; } } } } }