マウス・ホイールと、通知領域への表示

2010年6月10日(木)
PROJECT KySS

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を使ったサンプルを紹介します。

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています