mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-03 00:00:57 +08:00
188 lines
7.2 KiB
C#
188 lines
7.2 KiB
C#
//The MIT License(MIT)
|
|
|
|
//Copyright(c) 2016 Alberto Rodriguez & LiveCharts Contributors
|
|
|
|
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
//of this software and associated documentation files (the "Software"), to deal
|
|
//in the Software without restriction, including without limitation the rights
|
|
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
//copies of the Software, and to permit persons to whom the Software is
|
|
//furnished to do so, subject to the following conditions:
|
|
|
|
//The above copyright notice and this permission notice shall be included in all
|
|
//copies or substantial portions of the Software.
|
|
|
|
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
//SOFTWARE.
|
|
|
|
using System;
|
|
using Windows.UI.Xaml;
|
|
using Windows.UI.Xaml.Controls;
|
|
using LiveCharts.Charts;
|
|
using LiveCharts.Definitions.Charts;
|
|
using LiveCharts.Dtos;
|
|
using LiveCharts.Uwp.Charts.Base;
|
|
using LiveCharts.Uwp.Components;
|
|
|
|
namespace LiveCharts.Uwp
|
|
{
|
|
/// <summary>
|
|
/// Defines a visual element, a visual element is a UI element that is placed and scaled in the chart.
|
|
/// </summary>
|
|
public class VisualElement : FrameworkElement, ICartesianVisualElement
|
|
{
|
|
private ChartCore _owner;
|
|
|
|
// ReSharper disable once InconsistentNaming
|
|
/// <summary>
|
|
/// Gets or sets the user interface element.
|
|
/// </summary>
|
|
public FrameworkElement UIElement { get; set; }
|
|
/// <summary>
|
|
/// Gets or sets the index of the axis in X that owns the element, the axis position must exist.
|
|
/// </summary>
|
|
public int AxisX { get; set; }
|
|
/// <summary>
|
|
/// Gets or sets the index of the axis in Y that owns the element, the axis position must exist.
|
|
/// </summary>
|
|
public int AxisY { get; set; }
|
|
|
|
/// <summary>
|
|
/// The x property
|
|
/// </summary>
|
|
public static readonly DependencyProperty XProperty = DependencyProperty.Register(
|
|
"X", typeof (double), typeof (VisualElement),
|
|
new PropertyMetadata(default(double), PropertyChangedCallback));
|
|
/// <summary>
|
|
/// Gets or sets the X value of the UiElement
|
|
/// </summary>
|
|
public double X
|
|
{
|
|
get { return (double) GetValue(XProperty); }
|
|
set { SetValue(XProperty, value); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// The y property
|
|
/// </summary>
|
|
public static readonly DependencyProperty YProperty = DependencyProperty.Register(
|
|
"Y", typeof (double), typeof (VisualElement),
|
|
new PropertyMetadata(default(double), PropertyChangedCallback));
|
|
/// <summary>
|
|
/// Gets or sets the Y value of the UiElement
|
|
/// </summary>
|
|
public double Y
|
|
{
|
|
get { return (double) GetValue(YProperty); }
|
|
set { SetValue(YProperty, value); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds the or move.
|
|
/// </summary>
|
|
/// <param name="chart">The chart.</param>
|
|
/// <exception cref="System.ArgumentOutOfRangeException">
|
|
/// </exception>
|
|
public void AddOrMove(ChartCore chart)
|
|
{
|
|
if (chart?.AxisX == null || chart?.AxisY == null || UIElement == null) return;
|
|
if (UIElement.Parent == null)
|
|
{
|
|
chart.View.AddToDrawMargin(UIElement);
|
|
Canvas.SetZIndex(UIElement, 1000);
|
|
}
|
|
|
|
var coordinate = new CorePoint(ChartFunctions.ToDrawMargin(X, AxisOrientation.X, chart, AxisX),
|
|
ChartFunctions.ToDrawMargin(Y, AxisOrientation.Y, chart, AxisY));
|
|
|
|
var uwpChart = (CartesianChart) chart.View;
|
|
|
|
var uw = new CorePoint(
|
|
uwpChart.AxisX[AxisX].Model.EvaluatesUnitWidth
|
|
? ChartFunctions.GetUnitWidth(AxisOrientation.X, chart, AxisX)/2
|
|
: 0,
|
|
uwpChart.AxisY[AxisY].Model.EvaluatesUnitWidth
|
|
? ChartFunctions.GetUnitWidth(AxisOrientation.Y, chart, AxisY)/2
|
|
: 0);
|
|
|
|
coordinate += uw;
|
|
|
|
UIElement.UpdateLayout();
|
|
|
|
switch (VerticalAlignment)
|
|
{
|
|
case VerticalAlignment.Top:
|
|
coordinate = new CorePoint(coordinate.X, coordinate.Y - UIElement.ActualHeight);
|
|
break;
|
|
case VerticalAlignment.Center:
|
|
coordinate = new CorePoint(coordinate.X, coordinate.Y - UIElement.ActualHeight / 2);
|
|
break;
|
|
case VerticalAlignment.Bottom:
|
|
coordinate = new CorePoint(coordinate.X, coordinate.Y);
|
|
break;
|
|
case VerticalAlignment.Stretch:
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
|
|
switch (HorizontalAlignment)
|
|
{
|
|
case HorizontalAlignment.Left:
|
|
coordinate = new CorePoint(coordinate.X - UIElement.ActualWidth, coordinate.Y);
|
|
break;
|
|
case HorizontalAlignment.Center:
|
|
coordinate = new CorePoint(coordinate.X - UIElement.ActualWidth / 2, coordinate.Y);
|
|
break;
|
|
case HorizontalAlignment.Right:
|
|
coordinate = new CorePoint(coordinate.X, coordinate.Y);
|
|
break;
|
|
case HorizontalAlignment.Stretch:
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
|
|
if (chart.View.DisableAnimations)
|
|
{
|
|
Canvas.SetLeft(UIElement, coordinate.X);
|
|
Canvas.SetTop(UIElement, coordinate.Y);
|
|
}
|
|
else
|
|
{
|
|
if (double.IsNaN(Canvas.GetLeft(UIElement)))
|
|
{
|
|
Canvas.SetLeft(UIElement, coordinate.X);
|
|
Canvas.SetTop(UIElement, coordinate.Y);
|
|
}
|
|
|
|
var x = AnimationsHelper.CreateDouble(coordinate.X, uwpChart.AnimationsSpeed, "(Canvas.Left)");
|
|
var y = AnimationsHelper.CreateDouble(coordinate.Y, uwpChart.AnimationsSpeed, "(Canvas.Top)");
|
|
AnimationsHelper.CreateStoryBoardAndBegin(UIElement, x, y);
|
|
}
|
|
_owner = chart;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Removes the specified chart.
|
|
/// </summary>
|
|
/// <param name="chart">The chart.</param>
|
|
public void Remove(ChartCore chart)
|
|
{
|
|
chart.View.RemoveFromView(UIElement);
|
|
}
|
|
|
|
private static void PropertyChangedCallback(DependencyObject dependencyObject,
|
|
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
|
|
{
|
|
var element = (VisualElement) dependencyObject;
|
|
if (element._owner != null) element.AddOrMove(element._owner);
|
|
}
|
|
}
|
|
}
|