PR

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

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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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