ユーザ定義間隔でのラベル表示
ときには、ラベルの全体的な外観を、 AxisLabelAppearance での指定以上に加工する必要があります。このトピックでは、ラベルの外観を見栄えよくするための、カスタム キーワードの使用例を紹介します。この例では、X 軸に沿って 4 項目ごとの位置にラベルを配置しています。
ローソク足チャートでは、 SkipN プロパティで日付ラベルの間隔を設定できます。ただし、この機能は設計上すべてのグラフの種類で一様に使用できるわけではありません。AxisLabelAppearance オブジェクトは各ラベルに個々に適用されます。IRenderLabel を実装するアプリケーション オブジェクトが、呼び出された回数のカウンタを管理し、描画パスごとにリセットされるメカニズムを持っている場合は、代わりにカスタム キーワード描画機能を使用して、Chart アプリケーション内で上述した機能や同様の動作をシミュレートできます。以下に示す手順ごとの例でそのような実装について説明します。
-
まず、各軸上にラベルを描画する際に Chart が実行する IRenderLabel オブジェクトを実装する必要があります。これは、このオブジェクト上の ToString というよく知られたメソッドを Chart が呼び出すことによって実装されます。ToString は、アプリケーション オブジェクトが IRenderLabel インタフェースを実装する際に開発者が提供するメソッドです。
VB.NET では、インタフェースは以下の方法で実装することができます。
Imports Infragistics.UltraChart.Shared.Styles
Imports Infragistics.UltraChart.Resources
...
Public Class EveryFourthLabel
Implements IRenderLabel
Dim count As Integer
Dim itemsPerPass As Integer
Public Sub New( ByVal columnCount As Integer)
itemsPerPass = columnCount
count = 0
End Sub
Public Overloads Function ToString( ByVal context As Hashtable) _
As String Implements IRenderLabel.ToString
' 大部分の場合、何もレンダリングしません。
Dim result As String = String.Empty
Dim itemLabel As String = String.Empty
' コンテキストは ITEM_LABEL(SetLabel スタイルの軸)と
' DATA_VALUE(数値軸)のような組み込みの
' キーワードを含みます。
itemLabel = CStr( context("ITEM_LABEL"));
' 各ラベルの完全なパスが終わったら、
' 次のパスをリセットします。
If ( itemsPerPass = count ) Then
count = 0
End If
' 4 項目ごとに、項目のラベルをレンダリングします。
If ( ( count Mod 4 ) = 0 ) Then
result = itemLabel
End If
' IRenderLabel を呼び出した回数を
' カウントします。
count = count + 1
ToString = result
End Function
End Class
using Infragistics.UltraChart.Shared.Styles;
using Infragistics.UltraChart.Resources;
...
public class EveryFourthLabel : IRenderLabel
{
private int count;
private int itemsPerPass;
public EveryFourthLabel( int columnCount)
{
itemsPerPass = columnCount;
count = 0;
}
public string ToString( Hashtable context)
{
// 大部分の場合、何もレンダリングしません。
string result = String.Empty;
string itemLabel = String.Empty;
// コンテキストは ITEM_LABEL(SetLabel スタイルの軸)と
// DATA_VALUE(数値軸)のような組み込みの
// キーワードを含みます。
itemLabel = context["ITEM_LABEL"] as string;
// 各ラベルの完全なパスが終わったら、
// 次のパスをリセットします。
if ( itemsPerPass == count )
{
count = 0;
}
// 4 項目ごとに、項目のラベルをレンダリングします。
if ( count % 4 == 0 )
{
result = itemLabel;
}
// IRenderLabel を呼び出した回数を
// カウントします。
++count;
return result;
}
}
-
次に必要な手順は、この IRenderLabel 実装オブジェクト、および Chart でこのオブジェクトが実装しているカスタム キーワードを登録することです。登録は、 LabelHash プロパティを介して行います。このプロパティはカスタム キーワードを、対応する IRenderLabel 実装に関連付けるハッシュテーブルです。
カスタム IRenderLabel 実装の登録は通常、Chart 要素を含む Page_Load または Form_Load イベントハンドラ内で処理します。
Private Sub DisplayLabelsataUserDefinedInterval_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim labelRenderers As Hashtable = New Hashtable()
labelRenderers.Add("EVERY_FOURTH_X", New EveryFourthLabel(16))
If (Me.UltraChart1.LabelHash Is Nothing) Then
Me.UltraChart1.LabelHash = labelRenderers
End If
Me.UltraChart1.Axis.X.Labels.ItemFormat = AxisItemLabelFormat.Custom
Me.UltraChart1.Axis.X.Labels.ItemFormatString = "<EVERY_FOURTH_X>"
End Sub
private void DisplayLabelsataUserDefinedInterval_Load(object sender, EventArgs e)
{
Hashtable labelRenderers = new Hashtable();
labelRenderers.Add( "EVERY_FOURTH_X", new EveryFourthLabel(16));
if ( this.ultraChart1.LabelHash == null )
{
this.ultraChart1.LabelHash = labelRenderers;
}
this.ultraChart1.Axis.X.Labels.ItemFormat = AxisItemLabelFormat.Custom;
this.ultraChart1.Axis.X.Labels.ItemFormatString = "<EVERY_FOURTH_X>";
}
EveryFourthLabel コンストラクタが列カウントを取ることに注意してください。カウンタは、X 軸に沿って正常に描画された項目ラベルの数に対応しているはずです。EveryFourthLabel の ToString() の定義内で使用され、カウンタをリセットするタイミングを指定します。この技法は、IRenderLabel 実装オブジェクトの別個のキーワードとインスタンスを(独自のカウンタと共に)作成して使用する場合、複数の軸に適用できます。