Продолжение рефакторинга (вынесение WPF в отдельный проект)
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// Логика взаимодействия для ViewLadder.xaml
|
||||
/// </summary>
|
||||
internal partial class ViewLadder : UserControl
|
||||
{
|
||||
/// <summary>
|
||||
/// Ширина отступа глубины.
|
||||
/// </summary>
|
||||
[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<LadderType> Ladder
|
||||
{
|
||||
get { return (IEnumerable<LadderType>)GetValue(LadderProperty); }
|
||||
set { SetValue(LadderProperty, value); }
|
||||
}
|
||||
public static readonly DependencyProperty LadderProperty = DependencyProperty.Register(
|
||||
"Ladder",
|
||||
typeof(IEnumerable<LadderType>),
|
||||
typeof(ViewLadder),
|
||||
new FrameworkPropertyMetadata(
|
||||
Array.Empty<LadderType>(),
|
||||
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<LadderType> 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user