マウス・ホイールと、通知領域への表示
MainPageのプログラミング
レイアウトができたら、MainPageと、通知領域に表示するページのロジック・コードを記述します。
MainPage.xaml.vbには、リスト6のように記述します。
リスト6: メイン・ページのロジック・コード(MainPage.xaml.vb)
■[今日の予定]ボタンをクリックしたときの処理
IsRunningOutOfBrowserプロパティで、アプリケーションがブラウザ外で実行されているかどうかをチェックします。ブラウザ外実行でなければ、インストールを促すメッセージ・ボックスを表示します。
ブラウザ外で実行されている場合は、新しいユーザー・コントロールのインスタンス、myUserControlオブジェクトを生成します。NotificationWindowのContentプロパティにmyUserControlオブジェクトを指定します。Showメソッドで表示時間を指定して、通知ウインドウを表示します。最大表示時間は30000ミリセコンド(30秒)とし、これを超えると自動的に閉じるようにします。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
If App.Current.IsRunningOutOfBrowser = False Then
MessageBox.Show("インストールを実行してください。")
Else
Dim myUserControl As New SilverlightControl1
myNotify.Content = myUserControl
myNotify.Show(30000)
End If
End Sub
モジュールの追加とプログラミング
次に、通知領域に表示するページを作成していきます。
VS 2010のメニューから「Project/Add Module」を選択し、「Module」を追加します。「Name」はデフォルトのModule1.vbのままで進めます。Module1.vbの中に、パブリック変数として新しいNotificationWindowのインスタンス、myNotifyオブジェクトを生成して宣言するコードを記述します。このmyNotify変数は、MainPage.xaml.vbとSilverlightControl1.xaml.vbの両方で使用するため、モジュール内で宣言しておきます(リスト7)。
リスト7: モジュールのロジック・コード(Module.vb)
Module Module1
Public myNotify As New NotificationWindow
End Module
通知領域のプログラミング
最後に、通知領域に表示するSilverlightControl1.xaml.vbのロジック・コードを記述します(リスト8)。
リスト8: 通知領域のロジック・コード(SilverlightControl1.xaml.vb)
■名前空間の読み込み
Option Strict On
Imports System.Xml.Linq
■SilverlightControl1というユーザー・コントロールが読み込まれたときの処理
XElement.LoadメソッドでXML文書ファイルを読み込みます。
要素の内容が、実行日と同じ日付の要素のクエリー・コレクションを取得するクエリー(query)を定義して、これを実行します。クエリー・コレクション内を変数resultで反復処理しながら、以下の処理を実行します。
新しいParagraphのインスタンスmyParagraphオブジェクトを生成し、RichTextBox1コントロールの背景色を黄色に設定します。
新しいRunのインスタンスmyRun1オブジェクトを生成します。Runクラスは書式付き、または書式なしのテキストのセクションを表すクラスです。Textプロパティには要素の内容を指定します。
さらにフォント・サイズと文字色を指定します。また、新しいBoldのインスタンスmyBoldオブジェクトを生成し、日付を定義したmyRun1オブジェクトに太字を適用します。
新しいRunのインスタンスmyRun2オブジェクトを生成し、Textプロパティには要素の内容テキストを指定します。
新しいLinebreakのインスタンスmyLinebreakオブジェクトを生成します。Linebreakクラスは改行を表すクラスです。myParagraphオブジェクトに改行を追加して、日付の下で改行するようにします。
myParagraphオブジェクトに太字の設定されたタイトル(myBold)を追加し、改行して、内容の設定されたmyRun2を追加します。
myBold、myLinebreak、myRun2の定義されたmyParagraphオブジェクトをRichTextBox1オブジェクトに追加します。これで日付が赤い太字で表示され、その下に今日の予定が表示されるようになります。
ただし、このままでは、通知エリア内に表示された予定データが複数行にわたる場合、末尾が表示されてしまいます。そこで、日付の方から表示する処理を記述します(アミカケ部分)。それには、RichTextBox内の位置を表すTextPointerクラスを使います。ContentStartプロパティでRichTextBox内のコンテンツの始まりを示すTextPointer を取得します。GetNextInsertionPositionメソッドで、明示された論理方向(LogicalDirection.Forward)に、次の挿入位置となるTextPointer を返します。
このように取得した値を、Selectメソッドに指定します。SelectメソッドにはTextPointerオブジェクトの同じ値(startPointer)を指定しています。これで、TextPointerが先頭に移動し、データが先頭から表示されるようになります。
Private Sub SilverlightControl1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Dim xmldoc As XElement = XElement.Load("myPlan.xml")
Dim query = From c In xmldoc.Descendants("予定") Where c.Element("日付").Value.Equals(Date.Now.ToShortDateString) Select c
For Each result In query
Dim myParagraph As New Paragraph
RichTextArea1.Background = New SolidColorBrush(Colors.Yellow)
Dim myRun1 As New Run
myRun1.Text = result.Element("日付").Value
myRun1.FontSize = 14
myRun1.Foreground = New SolidColorBrush(Colors.Red)
Dim myBold As New Bold
myBold.Inlines.Add(myRun1)
Dim myRun2 As New Run
myRun2.Text = result.Element("内容").Value
Dim myLinebreak As New LineBreak
myParagraph.Inlines.Add(myBold)
myParagraph.Inlines.Add(myLinebreak)
myParagraph.Inlines.Add(myRun2)
RichTextArea1.Blocks.Add(myParagraph)
Next
Dim startPointer As TextPointer = RichTextBox1.ContentStart.GetNextInsertionPosition(LogicalDirection.Forward)
RichTextBox1.Selection.Select(startPointer, startPointer)
End Sub
■[閉じる]ボタンがクリックされたときの処理
[閉じる]ボタンがクリックされたときには、NotificationWindowを閉じます。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
myNotify.Close()
End Sub
サンプルができたら、実行する前に、前掲リスト3のXML文書中に、実行日のデータを追加してください。実行日のデータがなければ、NotificationWindowには何も表示されません。
なお、ブラウザ外実行アプリケーションの実行方法および削除方法については、前回記事を参照してください。
次回は、Silverlight 4で新たに追加されたDrag & Dropの機能と、RichTextBoxを使ったサンプルを紹介します。