NetAdvantage for Windows Forms では Presentation Layer Framework (PLF) というフレームワーク上でコントロールが動作しています。この PLF ではコントロールの各パーツが UIElement という基底クラスから派生しておりいろいろな局面でこの UIElement を取得し、処理を行うことが可能です。
今回は一例として、マウスがこの UIElement 要素に入った・抜けた際のイベント、MouseEneterElement / MouseLeaveElement イベントを活用し、UltraTimeLineView コントロールの予定にホバーさせた際に別のラベルコントロールで予定の内容を表示させるロジックを組み込みます。
元のサンプルは以下のエントリでご紹介したものを利用しています。
まずは予定情報を表示させるためのラベルを追加し、Load イベントでランダムに予定を追加するコードを実装します。

private void Form1_Load(object sender, EventArgs e)
{
// 省略...
// ランダムに予定を作成
Random rand = new Random(DateTime.Now.Millisecond);
double diff = 0;
this.ultraCalendarInfo1.Appointments.AddRange(
Enumerable.Range(1, 10).Select(i =>
new Appointment(DateTime.Now.AddMinutes(diff = rand.Next(120)),
DateTime.Now.AddMinutes(diff + rand.Next(30,120)))
{
Subject = "予定" + i.ToString(),
Owner = this.ultraCalendarInfo1.Owners[
rand.Next(1, this.ultraCalendarInfo1.Owners.Count)],
}).ToArray<Appointment>());
}
続けて、UltraTimeLineView の MouseEnter / MouseLeave イベントハンドラーをそれぞれ設定します。
どの要素に入った・抜けたかを見てみましょう。
private void ultraTimelineView1_MouseEnterElement(object sender,
Infragistics.Win.UIElementEventArgs e)
{
// マウス ポインタがどの UIElement 上に入っているか取得
Debug.WriteLine("Enter\t" + e.Element);
}
private void ultraTimelineView1_MouseLeaveElement(object sender,
Infragistics.Win.UIElementEventArgs e)
{
// マウス ポインタがどの UIElement から抜けたか取得
Debug.WriteLine("Leave\t" + e.Element);
}
この状態で実行するとデバッグ出力には現在のマウス位置に存在している要素クラスが出力されます。

予定オブジェクトでは、Infragistics.Win.UltraWinSchedule.TimelineView.AppointmentUIElement が表示要素として作成されるので、毎回のイベント発生時にチェックを行うことで特定の UI 要素で処理を追加することができます。
それぞれのイベントで処理を追加すると・・・
private void ultraTimelineView1_MouseEnterElement(object sender,
Infragistics.Win.UIElementEventArgs e)
{
// マウス ポインタがどの UIElement 上に入っているか取得
Debug.WriteLine("Enter\t" + e.Element);
// AppointmentUIElement の場合
if (e.Element is
Infragistics.Win.UltraWinSchedule.TimelineView.AppointmentUIElement)
{
// Appointment オブジェクトを取得
var apmntUIE = e.Element as
Infragistics.Win.UltraWinSchedule.TimelineView.AppointmentUIElement;
var appoint = apmntUIE.Appointment;
this.ultraLabel4.Text =
appoint.Owner.Name + "\t" +
appoint.Start.ToShortDateString() + " - " +
appoint.End.ToShortDateString() + "\t" +
appoint.Subject;
}
}
private void ultraTimelineView1_MouseLeaveElement(object sender,
Infragistics.Win.UIElementEventArgs e)
{
// マウス ポインタがどの UIElement から抜けたか取得
Debug.WriteLine("Leave\t" + e.Element);
if (e.Element is
Infragistics.Win.UltraWinSchedule.TimelineView.AppointmentUIElement)
this.ultraLabel4.ResetText();
}
実行すると、マウス ポインタの位置に合わせて右上のラベル表示が切り替わります。

この手法は UltraGrid や UltraDockManager など多くのコントロールで活用することができます。通常のイベントでは取得できないオブジェクトで何か処理を行いたい場合下記の注意点をご確認の上、是非お試しください。
注意点
UIElement はコントロールの各パーツを表現するクラスであるため、MouseEnterElement / MouseLeaveElement イベントの発生頻度はかなり高くなります。それぞれのイベントでコスト(処理時間)が大きいコードが記述されているとパフォーマンスの低下につながります。ご注意ください。
サンプルの実行には NetAdvantage for Windows Forms トライアル版が必要です。
サンプルソリューション
NetAdvantage for Windows Forms トライアル版
