2014年7月22日火曜日

VB WPF お勉強 04 Application クラス

WPF では、個々の Window を定義制御するコード以外に、Application というソースコードが存在します。
Form には、通常、なかったこのファイルは、作成しているソフトを制御しているみたいです。
特に、留意しておきたいのが、起動した Window の情報をここに保持している事です。
お勉強レベルではあまり関係ないですが、本格的になると避けられない そんな感じです。  [初心者の悪あがきぃレベル] です。.


Class Application の存在は、普通は、あまり関係ないです。
これを使うのは、きっと、WPF を もっと習得してからなのでしょう。

ソースコード(Application.xaml.vb)を開くと こんな コメントのみ記述されています。

' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
' このファイルで処理できます。

基本のおさらい。
自分で作っているソフトのプロジェクト WpfApplication1 を、オブジェクト ブラウザで開くと

 NameSpace : WpfApplication1
      Class : Application  (名称固定)
      Class : Window1

という構成になっているのが確認出来ます。
これを、ソリューション エクスプローラ で開くと、

 My Project
 Application.xaml
  (Application.xaml.vb)
 Window1.xaml
  (Window1.xaml.vb)

という構成です。
.xaml がデザイナーで表示される画面の設計で、.xaml.vb が画面を制御する所謂 コード です。
共に、テキストファイルですから、メモ帳 等でも極 普通に開いて見る事が出来ますね。

さて、Application に話を戻します。
このクラスは、起動される Windows の情報を保持しています。
Pablic Class ですから、Window1.xaml.vb から、次の様にアクセスする事で、
そのプロジェクトで現在使われている Windows の情報が得られます。  イメージです。 これでは役には ... 立たないなぁ。

Dim currentWindows As System.Windows.WindowCollection = Application.Current.Windows
Dim currentWindowsCount As Integer = Application.Current.Windows.Count
Dim i As Integer = 0  'TopWindow
Dim currentWindowName As String = Application.Current.Windows.Item(i).Title

スタートアップ画面になる Window1 以外(Application)が、画面情報を保持しているお陰で、
スタートアップ画面を閉じても、他に開かれている画面があれば、ソフトを終了しない様に構成が出来る訳です。

以前、VB WPF お勉強 03 シャットダウンモード で書いた 標準設定を変えないと Form と挙動が異なる のは、
Application.Current.Windows.Count が 0 にならないと、ソフトを終了しない標準設定になっているからですね。


さて、話を元に戻して。
あまり、出番はない気がしますが、
メイン画面に配置したボタンから、現在開かれている画面の一覧を取得し、ラベルに表示する例を。

    Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        Me.Button2.Content = "Win Inf"
        GetWindows()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
        GetWindows()
    End Sub

    Private Sub GetWindows()
        Dim listWindows As String = ""
        For i As Integer = 0 To Application.Current.Windows.Count - 1
            listWindows += "  " + Application.Current.Windows.Item(i).Title + Chr(13)
        Next i
        Me.Label1.Content = "Windows (" + Application.Current.Windows.Count.ToString + ")" + Chr(13) + listWindows
    End Sub
勿論、Window を生成するボタン や Me.MouseEnter の イベントハンドラに GetWindows() を記述すれば、挙動が掴めますね。

本来、この Application クラスの位置付けは、標準で用意された挙動を 細かく制御する場合に弄るもの と お勉強レベルでは 捕らえておきます。


次の投稿の最後にシリーズのリンクを纏めてあります。   VB WPF お勉強 01 印象



0 件のコメント:

コメントを投稿