找回密码
 立即注册

QQ登录

只需一步,快速开始

zfkingth

注册会员

1

主题

9

帖子

18

积分

注册会员

积分
18

活字格认证

最新发帖
zfkingth
注册会员   /  发表于:2014-7-10 17:07  /   查看:11267  /  回复:13
之前用win chart中的用Paint事件绘制了一些辅助线,如图



代码为
    private void c1Chart1_Paint(object sender, PaintEventArgs e)
        {

            if (call)
            {

                Font font = new Font(FontFamily.GenericSansSerif.Name, 9);
                System.Drawing.Pen pen = System.Drawing.Pens.Black;

                System.Drawing.Graphics ghs = e.Graphics;

                SizeF sf = ghs.MeasureString("1983", font);

                Pen dashPen = new Pen(Color.Gray);
                dashPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

                float height = sf.Height - 2f;

                float stringWidth = sf.Width;

                Font smallFont = new Font(FontFamily.GenericSansSerif.Name, 8);



                ghs.DrawLine(pen, new PointF(xcor1, ycor1 + height), new PointF(xcor2, ycor2 + height));

                for (int i = 0; i < cors.GetLength(0); i++)
                {
                    PointF beforePoint1 = new PointF(cors[i, 0], ycor1);
                    PointF beforePoint2 = new PointF(cors[i, 0], ycor1 + height);

                    PointF beforeHighPoint = new PointF(cors[i, 0], ycor_yMax);

                    PointF lastHighPoint = new PointF(cors[i, 1], ycor_yMax);



                    PointF lastPoint1 = new PointF(cors[i, 1], ycor1);
                    PointF lastPoint2 = new PointF(cors[i, 1], ycor1 + height);



                    ghs.DrawLine(pen, beforePoint1, beforePoint2);
                    ghs.DrawLine(pen, lastPoint1, lastPoint2);



                    ghs.DrawLine(dashPen, beforeHighPoint, beforePoint1);

                    ghs.DrawLine(dashPen, lastHighPoint, lastPoint1);

                    //显示年份
                    float distance = cors[i, 1] - cors[i, 0];
                    if (distance >= stringWidth)
                    {


                        float startXCor = cors[i, 0] + (distance - stringWidth) / 2.0f;
                        float startYCor = ycor1 + 0.2f;

                        ghs.DrawString((minYear + i).ToString(), smallFont, Brushes.Black, new PointF(startXCor, startYCor));
                    }
                }


                ghs.Save();


            }

        }


在wpf chart中没找到相关事件,不知道怎么实现,求解决。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

13 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2014-7-10 18:06:00
沙发
回复 1楼zfkingth的帖子

你好。
wpf 和 winform 的呈现方式是不同的,因此微软的WPF是不存在Paint事件的,具体参考微软的文档:WPF 图形呈现疑难解答
C1Chart在WPF平台下,可以自定义数据点的外观、颜色、大小、形状和标签等。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
zfkingth
注册会员   /  发表于:2014-7-10 18:32:00
板凳
问题是我想自己划几条线,可以实现吗。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-7-11 09:41:00
地板
回复 3楼zfkingth的帖子

可以实现。
C1Chart里可以随意的划线和区域,主要使用AlarmZone类。只需要通过4个属性设置矩形边界即可,分别是 Near、Far、LowerExtent 和 UpperExtent,如图:

用上述的4个属性,就可以将矩形设置为线或是点。
我们论坛和博客都有相关参考资料和例子。
论坛:http://gcdn.gcpowertools.com.cn/archiver/showtopic-12208.html
博客:http://blog.gcpowertools.com.cn/ ... chart-for-xaml.aspx
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
zfkingth
注册会员   /  发表于:2014-7-13 10:25:00
5#
非常感谢。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-7-14 11:12:00
6#
回复 5楼zfkingth的帖子

不客气。欢迎就本次回答评分。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
zfkingth
注册会员   /  发表于:2014-7-17 16:48:00
7#
不好意思,再次打扰你。我看了你的例子,自己也做了个,在c1chart中画线的使用了ChartPanel对象,可以自己画线了,但是不能在坐标轴区域画线。

怎么获取axis对应的AxisCanvas啊,再就是在什么事件中操作AxisCanvas比较好。
我用snoop对c1chart分析了一下,如下图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
zfkingth
注册会员   /  发表于:2014-7-17 16:53:00
8#
突然想了个办法,发现ChartPanel也是继承Canvas,修改ChartPanel的left和top属性,将其和AxisCanvas叠加,看行不行,我先试试。
回复 使用道具 举报
zfkingth
注册会员   /  发表于:2014-7-17 20:49:00
9#
说错了,不是继承,而是设置附加属性。
回复 使用道具 举报
zfkingth
注册会员   /  发表于:2014-7-17 21:27:00
10#
解决了,
    private ChartPanel cp = new ChartPanel();
   private void handleDraw()
        {
            if (c1Chart.Data.Children.Count &gt; 0)
            {
                cp.Children.Clear();

                var obj = new ChartPanelObject();


                Size stringSize = Hammergo.Utility.Helper.MeasureTextSize(&quot;1983&quot;, c1Chart.FontFamily, c1Chart.FontStyle, c1Chart.FontWeight, c1Chart.FontStretch, c1Chart.FontSize);

                //计算坐标
                calcAxis();

                var myLine = new Line();
                myLine.Stroke = System.Windows.Media.Brushes.Red;
                //myLine.X1 = xcor1;
                //myLine.Y1 = ycor1 + stringSize.Height;

                //myLine.X2 = xcor2;
                //myLine.Y2 = ycor2 + stringSize.Height;
                myLine.X1 = myLine.Y1 = 0;
                myLine.X2 = xcor2;
                myLine.Y2 = ycor2 + stringSize.Height;

                myLine.HorizontalAlignment = HorizontalAlignment.Left;
                myLine.VerticalAlignment = VerticalAlignment.Top;
                myLine.StrokeThickness = 2;



                obj.Content = myLine;
             //   obj.DataPoint = c1Chart.View.PointToData(new Point(0, 0));

             //   obj.Attach = ChartPanelAttach.DataXY;

                obj.Action = ChartPanelAction.None;

                cp.Children.Add(obj);


                if (c1Chart.View.Layers.Contains(cp) == false)
                    c1Chart.View.Layers.Add(cp);

                var rect = c1Chart.View.AxisX.GetAxisRect();

                cp.SetValue(Canvas.LeftProperty, rect.Left);
                cp.SetValue(Canvas.TopProperty, rect.Top);

                cp.Height = rect.Height;
                cp.Width = rect.Width;
               
            }

        }


     void ds_PlotElementLoaded(object sender, EventArgs e)
        {
            handleDraw();
        }

//定义事件的代码段
//只需一个serial 注册此事件的处理函数

XYDataSeries ds = new XYDataSeries();
     ds.PlotElementLoaded += ds_PlotElementLoaded;

评分

参与人数 1金币 +200 收起 理由
Alice + 200 解决问题的方法反馈到论坛。

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部