2012-08-03 34 views
5

Tôi có một ZedGraphControl với một vài đường cong trong đó và tôi muốn thêm các đường thẳng đứng tại một số vị trí x cố định. Các đường nên tất nhiên chỉ nằm trong khu vực đồ thị thực tế.Đường thẳng đứng ZedGraph với vấn đề LineObj

tôi đã cố gắng sau

LineObj line = new LineObj(Color.Black, xPos, myPane.YAxis.Scale.Min, xPos, myPane.YAxis.Scale.Max); 
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; 
line.Line.Width = 1f; 
myPane.GraphObjList.Add(line); 

và điều này hoạt động tốt cho đến khi người dùng phóng to biểu đồ, các đường dọc sau đó sẽ kéo dài ra khỏi khu vực biểu đồ thực tế (xem link pic dưới đây, cũng nhận thấy rằng nó không phải là tiêu tan bên trong đồ thị, lẻ).

http://imageshack.us/photo/my-images/196/zedgraphzoom.png/

Có cách nào để giải quyết này (nếu chỉ có aa cách để có được myPane.Xaxis.Scale.Min và Max của zoom hiện tại và sau đó cập nhật đồ thị trong ZoomEvent?) Hoặc là có bất kỳ lớp học/phương pháp tốt hơn để sử dụng khác hơn là LineObj cho mục đích này?

Trả lời

2

Thay vì xác định một LineObj, xác định một LineItem và thêm nó vào GraphPane.CurveList:

LineItem line = new LineItem(String.Empty, new[] { xPos, xPos }, 
       new[] { myPane.YAxis.Scale.Min, myPane.YAxis.Scale.Max }, 
       Color.Black, SymbolType.None); 
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; 
line.Line.Width = 1f; 

myPane.CurveList.Add(line); 

này liên kết với line với hệ tọa độ trong cửa sổ đồ thị, do đó khi bạn phóng to hoặc pan vị trí line sẽ vẫn bị giới hạn trong biểu đồ. Tất nhiên, nếu bạn thu nhỏ mà không cập nhật giá trị y của line, kết thúc line sẽ nằm bên trong biểu đồ.

Tôi biết từ kinh nghiệm cá nhân rằng việc rạng ngời có thể là một vấn đề trong Zedgraph; tuy nhiên, có vẻ như dấu gạch ngang được hiển thị đúng cách khi thêm LineItem.

+0

Hoạt động tốt miễn là bạn không gọi zedGraphControl.AxisChange() afterwords, trong trường hợp nó sẽ thêm lề ở phía dưới, nhưng tôi đoán bạn có thể làm mọi thứ yêu cầu cuộc gọi đó trước khi thêm dòng. Cảm ơn bạn! – HischT

+2

Một giải pháp là tạo trục Y thứ cấp, sau đó đặt scale.max và min thành cả 0 và 1, sau đó đính kèm LineItem vào nó với hai điểm (x, 0) và (x, 1). Bằng cách này, nó vẫn độc lập với trục kia. – Larry

2

Bạn đang sử dụng LineObj thay vì CurveItem.

Có giao diện trên cấu trúc Location và thuộc tính CoordinateFrame. Nó cho phép sử dụng hệ tọa độ khác cho X và/hoặc Y.

Đặt CoordinateFrame thành XScaleYChartFraction cho phép sử dụng 0d và 1d là Y, có nghĩa là "dưới cùng" và "trên cùng" của ngăn biểu đồ (thay vào đó của YAxis.Scale.Min và YAxis.Scale.Max), khi X tiếp tục sử dụng hệ tọa độ thang X trục.

Điều đó có nghĩa là bạn có thể sử dụng .AxisChange(), thu phóng, xoay và LineObj sẽ không can thiệp vào thay đổi tỷ lệ của trục Y!

var line = new LineObj(Color.Black, xPos, 0, xPos, 1); 

line.Location.CoordinateFrame = XScaleYChartFraction; // This do the trick ! 
line.IsClippedToChartRect = true; 

line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; 
line.Line.Width = 1f; 

myPane.GraphObjList.Add(line); 
+0

Điều này có vẻ như là một cách tốt hơn để làm điều đó hơn là thêm một LineItem, bởi vì các đường thẳng đứng là khái niệm khác với đường cong dữ liệu. – ricovox

+0

Nhiệm vụ của tôi cuối cùng cũng kết thúc. – KDecker

Các vấn đề liên quan