C#--工作笔记(直方图整体UserControls)

来源:互联网 发布:基金组合 知乎 编辑:程序博客网 时间:2024/06/05 19:55
<UserControl x:Class="Health365IIProjectView.HartHistogramControl"             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"              mc:Ignorable="d" Loaded="UserControl_Loaded" SizeChanged="UserControl_SizeChanged">    <Canvas x:Name="HeartbeatHistogram" Background="DarkGray">            </Canvas></UserControl>

===================================================================================================================

using System;using System.Collections.Generic;using System.Linq;using System.Text;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 Health365IIProjectBLL;namespace Health365IIProjectView{   //internal delegate void user_OnClick(int index);    /// </summary>    /// HartHistogramControl.xaml 的交互逻辑    /// </summary>    public partial class HartHistogramControl : UserControl    {        //声明委托        internal delegate void user_OnClick(int index);        //声明事件        internal event user_OnClick UXEvent;        /// <summary>        /// 用来矩形颜色的显示        /// </summary>        private Color[,] colorsSolution = new Color[2, 3]        {           {Color.FromRgb(0,142,143),Color.FromRgb(0,113,113),Color.FromRgb(0,92,93)},           {Color.FromRgb(246,188,16),Color.FromRgb(194,153,11),Color.FromRgb(111,139,161)}        };        /// <summary>        /// 保存心率直方图的数组        /// </summary>        private int[] _HeartRateArray;        /// <summary>        /// 左边框的属性值        /// </summary>        private int _leftBorder = 35;        /// <summary>        /// <summary>        /// 右边框的属性值        /// </summary>        private int _rightBorder = 20;        /// <summary>        /// 上边框的属性值        /// </summary>        private int _topBorder = 10;        /// <summary>        /// 下边框的属性值        /// </summary>        private int _bottomBorder = 20;         /// <summary>        /// 数据的单位        /// </summary>        private int _dataUnit;        /// <summary>        /// 数据单位的显示        /// </summary>        private string _unitName;        /// <summary>        /// x轴单位像素宽度        /// </summary>        private double _xUnitP;         /// 纵轴刻度个数        /// </summary>        private int _yUnitCount;        /// <summary>        /// 纵轴一个刻度对应的值        /// </summary>        private int _yUnitValue;               public HartHistogramControl()        {            InitializeComponent();        }        /// <summary>        /// 设置数据,并开始构建直方图;        /// </summary>        /// <param name="data"></param>        /// <param name="dataUnit"></param>        /// <param name="unitName"></param>        public void SetData(int index,int[] data,int dataUnit,string unitName)        {            //获取数组            _HeartRateArray = data;            //用来显示一个值            _dataUnit = dataUnit;            //单位显示            _unitName = unitName;            if (_HeartRateArray != null)            {                Drawing(index);            }            //if (index != 0)            //{            //    if (_HeartRateArray[index] == 0)            //    {            //    }            //    else            //    {            //        CreateChartColumn(index, _xUnitP - ActualWidth / 350, _HeartRateArray[index] * 30 / _yUnitValue, _leftBorder + _xUnitP * index , _bottomBorder + 2, Color, _HeartRateArray[index]);            //    }            //}        }        /// <summary>        /// 开始画心率直方图        /// </summary>        private void Drawing(int _index)        {            _yUnitCount = Convert.ToInt32(ActualHeight - _topBorder - _bottomBorder) / 30;            //求出一个刻度的单位大小            if (_yUnitCount <= 0)            {            }            else            {                _yUnitValue = _HeartRateArray.Max() / _yUnitCount;            }            this.HeartbeatHistogram.Children.Clear();            //清理画板                        //当前宽度-左边距-右边距=X轴的长度/数组长度=X轴一个单位的像素            _xUnitP = (ActualWidth -_leftBorder -_rightBorder)/_HeartRateArray.Length;            //y轴的长度            int y0 =Convert.ToInt32(ActualHeight - _bottomBorder);            //画坐标X从左边距为起点,到右边距结束,定位为y轴的开始位置            DrawingPolyline(new Point(_leftBorder, y0), new Point(ActualWidth - _rightBorder, y0));            //画坐标Y长度开始,到上边距结束,定位为坐边距            DrawingPolyline(new Point(_leftBorder, y0), new Point(_leftBorder, _topBorder));            //x坐标间距            for (int i = 1; i <= _HeartRateArray.Length; i++)            {                //5个大格1个单位                if (i % 5 == 0)                {                    Label l = new Label();                    //设置X轴显示的位置                    l.SetValue(Canvas.TopProperty, y0+2.0);                    //设置X轴间隔与字体的对应位置                    l.SetValue(Canvas.LeftProperty, _leftBorder + _xUnitP                        * i - 15);                    //显示值                    l.Content = (_dataUnit * i).ToString();                    this.HeartbeatHistogram.Children.Add(l);                    //画X坐标的间距 从左边距+一个格子像素值*显示值的距离=坐标间距的长度   定位Y轴长度 +3为了让坐标显示;                    DrawingPolyline(new Point(_leftBorder + _xUnitP * i, y0), new Point(_leftBorder + _xUnitP * i, y0 + 3));                }                         }            //y坐标间距            for (int i = 0; i <= _yUnitCount; i++)            {                //画Y坐标的间距 从左边距开始 -2为了让坐标显示,y轴的长度-30(显示的距离)*i=要显示Y间距的长度                DrawingPolyline(new Point(_leftBorder, y0 - 30 * i), new Point(_leftBorder - 2, y0 - 30 * i));                Label l = new Label();                //设置Y值显示的位置                l.SetValue(Canvas.TopProperty, y0 - 30 * i - 13.0);                //设置Y值对齐方式,以右边框对齐(值的个位对齐)                l.SetValue(Canvas.RightProperty, ActualWidth - _leftBorder - 3);                //设置显示的值                l.Content = (_yUnitValue * i).ToString();                this.HeartbeatHistogram.Children.Add(l);            }            //画柱状体,根据数组的长度添加的高度和宽度            for (int index = 0; index < _HeartRateArray.Length; index++)            {                //当等于0时,不显示值                if (_HeartRateArray[index] == 0)                {                }                else                {                    if (_yUnitCount <= 0)                    {                    }                    else                    {                        if (_index == index)                        {                            CreateChartColumn(_index, _xUnitP - ActualWidth / 350, _HeartRateArray[index] * 30 / _yUnitValue, _leftBorder + _xUnitP * index, _bottomBorder + 2, 1, _HeartRateArray[index]);                        }                        else                        {                            //开始画矩形图 1.宽度 除350是为了不要显示太宽 2.显示的值 3.左边距 4.下边距 5.颜色                            CreateChartColumn(index, _xUnitP - ActualWidth / 350, _HeartRateArray[index] * 30 / _yUnitValue, _leftBorder + _xUnitP * index, _bottomBorder + 2, 0, _HeartRateArray[index]);                        }                    }                }                        }                       //总和            int sum = _HeartRateArray.Sum();            DrawTextValue("R--R期间直方图,共计统计心搏" + sum + "次",_leftBorder,0);            //数量            DrawTextValue("数量",0,0);            //用来传入单位的            //1.单位。2,X轴的终点位置。3,Y轴的终点位置            DrawTextValue(_unitName, ActualWidth - _rightBorder - 2, y0-10);                    }        public void DrawTextValue(String result, double Left, double top)        {            TextBlock tb = new TextBlock();            tb.Text = result;            tb.Margin = new Thickness(Left,top,0,0);            this.HeartbeatHistogram.Children.Add(tb);        }        /// <summary>        /// 画XY坐标方法        /// </summary>        private void DrawingPolyline(Point p1, Point p2)        {            Polyline p = new Polyline();            p.Stroke = new SolidColorBrush(Color.FromArgb(255, 0, 0, 0));            p.StrokeThickness = 1.0;            p.Points.Add(p1);            p.Points.Add(p2);            this.HeartbeatHistogram.Children.Add(p);        }        //布局调整        private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)        {            //SetCreateChartColumn(21);            //if (_HeartRateArray != null)           // {                // this.HeartbeatHistogram.Children.Clear();                   // Drawing();                       // }                   }        private void UserControl_Loaded(object sender, RoutedEventArgs e)        {                   }         /// <summary>        /// 绘制3D矩形图        /// </summary>        /// <param name="width">宽度</param>        /// <param name="height">显示的值</param>        /// <param name="left">左边距</param>        /// <param name="bottom">下边距</param>        /// <param name="colorFill">颜色</param>        public void CreateChartColumn(int index,double width, double height, double left,int bottom,int colorFill,int arr)        {            Cylinder3DControl p3dc = new Cylinder3DControl();            Color[] cList = setColor(colorFill);            if (width < 0 || height < 0)            {            }            else            {                p3dc.InitSettingCylinder3DControl(width, height, cList);                p3dc.Height = height + width / 3;                p3dc.Width = width / 3 * 4;            }                                p3dc.Tag = index;            p3dc.ToolTip=arr;            Canvas.SetLeft(p3dc, left);//用来控制X矩形显示开始的位置            Canvas.SetBottom(p3dc, bottom);            p3dc.Margin = new Thickness(0, 0, 0, 0);                        //事件点击            p3dc.MouseLeftButtonDown += new MouseButtonEventHandler(sp_MouseLeftButtonDown);            this.HeartbeatHistogram.Children.Add(p3dc);                    }        /// <summary>        /// 改变颜色        /// </summary>        /// <param name="index"></param>        /// <returns></returns>        private Color[] setColor(int index)        {            Color[]  clist = new Color[3];            clist[0] = colorsSolution[index, 0];            clist[1] = colorsSolution[index, 1];            clist[2] = colorsSolution[index, 2];            return clist;        }        /// <summary>        /// 只做变色处理,逻辑处理过程在page页        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        public void sp_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)        {            Color[] cDefaultList=setColor(0);            Color[] cNewList = setColor(1);            Cylinder3DControl p3dc = (Cylinder3DControl)sender;            foreach (UIElement uie in HeartbeatHistogram.Children)            {                if (uie is Cylinder3DControl) ((Cylinder3DControl)uie).SettingPlume3DColors(cDefaultList);            }            p3dc.SettingPlume3DColors(cNewList);            //逻辑事件处理,用来发送委托到Page层           // UXEvent((int)p3dc.Tag);            UXEvent((int)p3dc.Tag);        }    }}


0 0
原创粉丝点击