mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-04-13 12:46:36 +08:00
项目结构调整
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
<UserControl x:Class="Wpf.CartesianChart.ZoomingAndPanning.ZoomingAndPanning"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Wpf.CartesianChart"
|
||||
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
|
||||
xmlns:zoomingAndPanning="clr-namespace:Wpf.CartesianChart.ZoomingAndPanning"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="300" d:DesignWidth="300" d:DataContext="{d:DesignInstance local:ZoomingAndPanning}">
|
||||
<UserControl.Resources>
|
||||
<zoomingAndPanning:ZoomingModeCoverter x:Key="ZoomingModeCoverter"></zoomingAndPanning:ZoomingModeCoverter>
|
||||
</UserControl.Resources>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"></RowDefinition>
|
||||
<RowDefinition Height="Auto"></RowDefinition>
|
||||
<RowDefinition Height="*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Grid.Row="0" TextWrapping="Wrap">
|
||||
Use the Chart.Zoom property to enable zooming and panning, you have some options: None, X, Y and XY, click, hold and drag the chart for panning.
|
||||
</TextBlock>
|
||||
<StackPanel Grid.Row="1">
|
||||
<Button Click="ToogleZoomingMode">
|
||||
<TextBlock>Toggle zoming mode, current is:
|
||||
<TextBlock Text="{Binding ZoomingMode, Converter={StaticResource ZoomingModeCoverter}}"/>
|
||||
</TextBlock>
|
||||
</Button>
|
||||
<Button Click="ResetZoomOnClick">Reset Zoom</Button>
|
||||
</StackPanel>
|
||||
<lvc:CartesianChart Grid.Row="2" Series="{Binding SeriesCollection}" Zoom="{Binding ZoomingMode}" >
|
||||
<lvc:CartesianChart.AxisX>
|
||||
<lvc:Axis Name="X" LabelFormatter="{Binding XFormatter}"
|
||||
Separator="{x:Static lvc:DefaultAxes.CleanSeparator}"/>
|
||||
</lvc:CartesianChart.AxisX>
|
||||
<lvc:CartesianChart.AxisY>
|
||||
<lvc:Axis Name="Y" LabelFormatter="{Binding YFormatter}"/>
|
||||
</lvc:CartesianChart.AxisY>
|
||||
</lvc:CartesianChart>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Media;
|
||||
using LiveCharts;
|
||||
using LiveCharts.Defaults;
|
||||
using LiveCharts.Wpf;
|
||||
|
||||
namespace Wpf.CartesianChart.ZoomingAndPanning
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for ZoomingAndPanning.xaml
|
||||
/// </summary>
|
||||
public partial class ZoomingAndPanning : INotifyPropertyChanged
|
||||
{
|
||||
private ZoomingOptions _zoomingMode;
|
||||
|
||||
public ZoomingAndPanning()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
var gradientBrush = new LinearGradientBrush {StartPoint = new Point(0, 0),
|
||||
EndPoint = new Point(0, 1)};
|
||||
gradientBrush.GradientStops.Add(new GradientStop(Color.FromRgb(33, 148, 241), 0));
|
||||
gradientBrush.GradientStops.Add(new GradientStop(Colors.Transparent, 1));
|
||||
|
||||
SeriesCollection = new SeriesCollection
|
||||
{
|
||||
new LineSeries
|
||||
{
|
||||
Values = GetData(),
|
||||
Fill = gradientBrush,
|
||||
StrokeThickness = 1,
|
||||
PointGeometrySize = 0
|
||||
}
|
||||
};
|
||||
|
||||
ZoomingMode = ZoomingOptions.X;
|
||||
|
||||
XFormatter = val => new DateTime((long) val).ToString("dd MMM");
|
||||
YFormatter = val => val.ToString("C");
|
||||
|
||||
DataContext = this;
|
||||
}
|
||||
|
||||
public SeriesCollection SeriesCollection { get; set; }
|
||||
public Func<double, string> XFormatter { get; set; }
|
||||
public Func<double, string> YFormatter { get; set; }
|
||||
|
||||
public ZoomingOptions ZoomingMode
|
||||
{
|
||||
get { return _zoomingMode; }
|
||||
set
|
||||
{
|
||||
_zoomingMode = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void ToogleZoomingMode(object sender, RoutedEventArgs e)
|
||||
{
|
||||
switch (ZoomingMode)
|
||||
{
|
||||
case ZoomingOptions.None:
|
||||
ZoomingMode = ZoomingOptions.X;
|
||||
break;
|
||||
case ZoomingOptions.X:
|
||||
ZoomingMode = ZoomingOptions.Y;
|
||||
break;
|
||||
case ZoomingOptions.Y:
|
||||
ZoomingMode = ZoomingOptions.Xy;
|
||||
break;
|
||||
case ZoomingOptions.Xy:
|
||||
ZoomingMode = ZoomingOptions.None;
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
private ChartValues<DateTimePoint> GetData()
|
||||
{
|
||||
var r = new Random();
|
||||
var trend = 100;
|
||||
var values = new ChartValues<DateTimePoint>();
|
||||
|
||||
for (var i = 0; i < 100; i++)
|
||||
{
|
||||
var seed = r.NextDouble();
|
||||
if (seed > .8) trend += seed > .9 ? 50 : -50;
|
||||
values.Add(new DateTimePoint(DateTime.Now.AddDays(i), trend + r.Next(0, 10)));
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
protected virtual void OnPropertyChanged(string propertyName = null)
|
||||
{
|
||||
if (PropertyChanged != null) PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
private void ResetZoomOnClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
//Use the axis MinValue/MaxValue properties to specify the values to display.
|
||||
//use double.Nan to clear it.
|
||||
|
||||
X.MinValue = double.NaN;
|
||||
X.MaxValue = double.NaN;
|
||||
Y.MinValue = double.NaN;
|
||||
Y.MaxValue = double.NaN;
|
||||
}
|
||||
}
|
||||
|
||||
public class ZoomingModeCoverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
switch ((ZoomingOptions) value)
|
||||
{
|
||||
case ZoomingOptions.None:
|
||||
return "None";
|
||||
case ZoomingOptions.X:
|
||||
return "X";
|
||||
case ZoomingOptions.Y:
|
||||
return "Y";
|
||||
case ZoomingOptions.Xy:
|
||||
return "XY";
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user