using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Pf2e.WPF.EntityViewer; using Pf2e.WPF.EntityViewer.EntityViewStructure; namespace Pf2e.WPF.EntityViewer.Component; /// /// Логика взаимодействия для ViewLadder.xaml /// internal partial class ViewLadder : UserControl { /// /// Ширина отступа глубины. /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [Category("Entity Render")] [Description("The size of tab.")] public double DepthSize { get { return (double)GetValue(DepthSizeProperty); } set { SetValue(DepthSizeProperty, value); } } public static readonly DependencyProperty DepthSizeProperty = DependencyProperty.Register( "DepthSize", typeof(double), typeof(ViewLadder), new FrameworkPropertyMetadata(20.0, new PropertyChangedCallback(OnValueChanged)) ); public IEnumerable Ladder { get { return (IEnumerable)GetValue(LadderProperty); } set { SetValue(LadderProperty, value); } } public static readonly DependencyProperty LadderProperty = DependencyProperty.Register( "Ladder", typeof(IEnumerable), typeof(ViewLadder), new FrameworkPropertyMetadata( Array.Empty(), new PropertyChangedCallback(OnValueChanged) ) ); private static void OnValueChanged( DependencyObject obj, DependencyPropertyChangedEventArgs args ) { ViewLadder control = (ViewLadder)obj; control.Rebuild(); } public ViewLadder() { InitializeComponent(); } public void Rebuild() { int n = Ladder.Count(); Width = n * DepthSize; DrawingGroup result = new(); result.Children.Add( new GeometryDrawing() { Geometry = new RectangleGeometry(new(0, 0, n * DepthSize, Height)), Pen = new(Brushes.Transparent, 0), } ); result.Children.Add( new GeometryDrawing() { Geometry = GetLadderGeometryGroup(Ladder, DepthSize, Height), Pen = new(Brushes.Black, 1), } ); TargetCanvas.Background = new DrawingBrush(result); } private GeometryGroup GetLadderGeometryGroup(IEnumerable ladder, double w, double h) { GeometryGroup geometryGroup = new(); double w2 = w / 2; double h2 = h / 2; int i = 0; foreach (LadderType ladderType in ladder) { switch (ladderType) { case LadderType.Empty: break; case LadderType.Last: geometryGroup.Children.Add( new LineGeometry(new(i * w + w2, 0), new(i * w + w2, h2)) ); geometryGroup.Children.Add( new LineGeometry(new(i * w + w2, h2), new(i * w + w, h2)) ); break; case LadderType.Through: geometryGroup.Children.Add( new LineGeometry(new(i * w + w2, 0), new(i * w + w2, h)) ); if (i == ladder.Count() - 1) { geometryGroup.Children.Add( new LineGeometry(new(i * w + w2, h2), new(i * w + w, h2)) ); } break; default: throw new ArgumentOutOfRangeException(nameof(ladder)); } i++; } return geometryGroup; } }