2012年11月14日水曜日

70-502VB TS: Microsoft .NET Framework 3.5 - Windows Presentation Foundation (VB.NET)

MCTS 問題1 / 10   REF:70-502VB.19054


チョコレート菓子メーカーのために、 Microsoft .NET 3.5 Frameworkを使ってWindows Presentation Foundation (WPF) アプリケーションを開発しています。 ほとんどのコンテンツは静的ユーザー インターフェイスに基づいていますが、ユーザーのフィードバックに従って継続的に改訂を行う必要があります。 最善のパフォーマンスを提供しながら、開発・サポートに対して最小限の時間を使用するようなテクノロジを選択する必要があります。

どのテクノロジを使用すればいいですか?









解説:

ダイナミック WPF コンテンツ ファイルを生成するために、Loose XAML (Extensible Application Markup Language) アプリケーション ファイルを作成する必要があります。ダイナミック WPF コンテンツ ファイルは、最善のパフォーマンスを提供し、開発やサポートに費やす時間を最小限に抑えます。 Loose XAML アプリケーションの使用は、静的な視覚コンテンツのみのレンダリングに制限されます。静的コンテンツは、アプリケーション固有のコードを書き込まなくても常に更新することができます。これは、Loose XAML ファイルがコード ビハインド ファイルを使用しないことから、コンテンツがアプリケーションコードに依存せず、XAML マークアップへの更新が瞬時に行えるためです。 残念ながら、Loose XAML に対するフルイベント処理はサポートされていません。しかし、コマンド バインディングとその他のシンプルなユーザー インタラクションはサポートされています。 Web サーバー用の静的コンテンツ ファイルを作成する上で、Loose XAML はパワフルで低コストな方法です。

WPF コンテンツ ファイルを生成するために、HTML(Hyper Text Markup Language) アプリケーション ファイルを作成するのは間違いです。 HTML は、有効なWPF ファイル形式ではありません。HTML を使用して、リッチ 3-D WPF Web コンテンツ ファイルを作成することはできません。 HTML はマークアップ言語で、WPF テクノロジを使用しない静的Webページを作成する際に使用されます。

リッチ 3-D WPF Web コンテンツ ファイルを生成するために、XML (Extensible Markup Language) アプリケーション ファイルを作成するのは間違いです。 XML は、Web コンテンツを表示するために使用される有効な WPF ファイル形式ではありません。 XML は、構造化された手法で情報を保存する際に使用されます。 XML は、XAML構文の基礎を構成します。XAMLコンパイラを持たないXMLと必要な名前空間は、解析、或いはコンパイルされません。

XAML ブラウザ アプリケーション(XBAP)アプリケーションファイルを作成するのは間違いです。このファイルでは、Loose XAML ファイルよりも多くの時間を開発、サポートに費やす必要があります。 XBAP アプリケーションは、コード ビハインドファイルとイベント処理をサポートしますが、これによりファイルサイズが大きくなり、配置が更に難しくなります。 XBAP アプリケーションは IIS でホストされている、ブラウザベースのアプリケーションです。

参考資料:

MSDN > MSDN ライブラリ >テクニカルドキュメント > Windows Vista > Windows Presentation Foundation > Web における Windows Presentation Foundation: XAMLブラウザアプリケーション

MCTS 問題1 / 10   REF:70-502VB.19060


Microsoft .NET 3.5 Frameworkを使って、Windows Presentation Foundation (WPF) ブラウザ アプリケーションを開発しています。 あなたはページ上に、100 ピクセルの正方形を表示するつもりです。 また、Page のローディング完了時に、 test_controlsメソッドを実行させたいと考えています。

これらの要件を満たすには、どのXAML コード セグメントを使用すればいいですか?









解説:

このシナリオの条件を満たすには、test_controls メソッドを Loaded イベントに割り当てます。 これを行うには、次のマークアップを使用します。

<Page

xmlns="http : //schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http : //schemas.microsoft.com/winfx/2006/xaml"

x:Name="MainPage" Loaded="test_controls">

<Rectangle Width="100" Height= "100"/>

</Page>


上記のコードは、100 ピクセルの正方形を表示し、ページがロードされたときに test_controls メソッドを実行します。 Loadedイベントは、要素のローディングが完了した後、レンダリングの前に実行されます。 また、入れ子になった Loaded イベントを持つことも可能です。 その場合は、子オブジェクトの Loaded イベントは親オブジェクトの Loaded イベントの前に実行されます。

コード ビハインド ファイル内で AddHandler メソッドを使って、イベントをメソッドに添付することもできます。 次のコードは、test_controls 関数を、ページの Loadedイベントに添付します。

AddHandler(this.Loaded, test_controls);


ルーティング イベントにイベントハンドラを関連させるには、XAML (Extensible Application Markup Language) に要素属性を指定するか、または標準のイベントと同様に、共通言語ランタイム (CLR) コード内のイベント ハンドラの関連性を指定します。 XAML では、次の構文を使用します。

<Element EventTypeName="EventHandlerName" />


ルーティング イベント処理では、ルーティング イベントがそのイベントを発生させた要素を超えて、複数の要素によって処理できるため、標準のイベント処理よりも高い信頼性を提供します。 ルーティング イベントは、要素階層内を次の3つのメカニズム内の1つを使って移動します。


  • バブル: イベントを発生させた要素から始まります。ここからルートまで、要素階層の上位に向かってに移動します。これは、最も一般的なメカニズムです。
  • トンネル: 要素階層のルートから始まります。ここから、イベントを発生させた要素まで、要素階層内を下位に向かって移動します。このメカニズムを使用する多くのイベントは、"preview" イベントとして知られています。
  • 直接: イベントを発生させた要素だけがイベントを処理できます。このメカニズムは、クラス処理をサポートします。
Completed イベントまたは onLoad イベントを処理するマークアップを使用するのは間違いです。このようなイベントは Page クラスに存在しません。

Rectangle要素をPage 要素内に配置しないコードを使用するのは間違いです。これは適切な形式のXMLではありません。 適切な形式のXMLは、ルート要素だけを格納することができ、そのルート要素は必ず Page 要素でなければなりません。 また、Page 要素によって使用される必須 XAML 名前空間は、Rectangle要素に適用されません。 Rectangle 要素をPage 要素の子にする必要があります。

参考資料:

MSDN > MSDN ライブラリ > .Net 開発 > .Net Framework 3.5 > .Net Framework > Windows Presentation Foundation > WPF の基礎 > イベント (WPF) > ルーティングイベントの概要

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > WPF の基礎 > イベント (WPF) > ルーティング イベントの処理済みとしてのマーキング、およびクラス処理

MCTS 問題1 / 10   REF:70-502VB.19132


Microsoft .NET 3.5 Frameworkを実行している Windows Presentation Foundation (WPF) アプリケーションを構成する必要があります。 アプリケーションは、MainFile というアセンブリを格納しています。

MainFile アセンブリを最初にロードするスタンドアロン アプリケーションをビルドする必要があります。

どうすればいいですか?









解説:

MainFile アセンブリを最初にロードするために、.csproj ファイルで次のマークアップを追加します。

<AssemblyName>MainFile</AssemblyName>

<OutputType>winexe</OutputType>

<OutputPath>bin\$(Configuration)\</OutputPath>


.csproj プロジェクト ファイルで、プロジェクト構成情報を構成し、指定する必要があります。 AssemblyName要素は、アセンブリ名を指定します。 MainFileをアセンブリ名として指定して、ファイルをメイン ファイルとして指定します。 OutputType要素は、アプリケーションをビルドしたいと考えるターゲットの種類を指定します。 要件により、ファイルはウィンドウで開く必要があります。このため、ターゲット タイプを winexeに設定します。 winexe ターゲット ファイル値は、.exeファイルとしてアプリケーションをビルドします。 OutputPath要素は、ビルド ファイルのパスを指定します。 また、HostInBrowser 要素を指定して、これが XAMLブラウザ アプリケーション (XBAP) かどうかを示すことができます。

MainFile.xamlファイルでマークアップを追加するのは間違いです。プロジェクト構成設定は、プロジェクト ファイル内、すなわちこのシナリオでは、.csproj内だけで指定することができます。

ターゲット タイプを library として指定するのは間違いです。library ターゲット タイプは、Windowsベースのプロジェクトを作成しません。 library ターゲット タイプ プロジェクトは .dll ファイルを作成します。 このような .dll ファイルは他のファイルによって使用されることは可能ですが、スタンドアロン アプリケーションとして実行することはできません。

参考資料:

MSDN > MSDN ライブラリ > .Net 開発 > .Net Framework 3.5 > .Net Framework > Windows Presentation Foundation >アプリケーション開発 > Windows Presentation Foundation アプリケーションのビルドと配置 > WPF アプリケーション (WPF) のビルド

MCTS 問題1 / 10   REF:70-502VB.19263


Microsoft .NET 3.5 Frameworkを使って、Windows Presentation Foundation (WPF) アプリケーションを開発しています。 アプリケーション状態データをローカル クライアントに保存し、イベント処理をサポートできるアプリケーションを作成する必要があります。 このアプリケーションには、低度の信頼環境で実行されることを保証したいと考えています。

どのタイプの WPF アプリケーションを作成すればいいですか?









解説:

イベント処理と、ローカル クライアントへのアプリケーション状態データの保存をサポートするには、XAML ブラウザアプリケーション(XBAP) を作成します。XBAP アプリケーションは、ユーザーがブラウザ内で実行するために IIS でホストされているブラウザ ベースのアプリケーションです。 XBAP は、システムリソースへの制限付きアクセスを提供し、部分信頼を提供します。XBAP アプリケーションは Visual Studio 2008の ClickOnce 配置機能を使用して配置できます。

クライアントへのアプリケーション状態データの保存と、イベント処理をサポートさせるために、スタンドアロン WPF アプリケーションを作成するのは間違いです。これは、スタンドアロン アプリケーションが完全信頼環境で実行されるためです。 スタンドアロン アプリケーションは完全信頼を提供し、システム リソースへのアクセスを受け付けます。 スタンドアロン アプリケーションはクライアント マシンにインストールされて [スタート] メニューに表示され、オフラインでも使用できます。 スタンドアロン アプリケーションは MSI ファイルまたは ClickOnce テクノロジのいずれかを使用してインストールされます。

クライアントにアプリケーション状態データを保存し、イベント処理をサポートするために、Loose XAML (Extensible Application Markup Language) アプリケーションを作成するのは間違いです。Loose XAML アプリケーションは、イベント処理やアプリケーション状態データのローカル クライアントへの保存をサポートしません。 Loose XAML アプリケーションの使用は、静的な視覚コンテンツのみのレンダリングに制限されます。なぜなら、これらはサーバーにより動的に生成されているためです。

クライアント上にアプリケーション状態データを保存し、イベント処理をサポートさせるために、WPF カスタム コントロール ライブラリを作成するのは間違いです。 コントロール ライブラリは、スタンドアロン アプリケーションによってメモリ内にロードされるダイナミック リンク ライブラリ (DLL) で、実行可能ファイルではありません。 カスタム コントロールを実行するには、DLLの参照により実行可能アプリケーションにカスタム コントロールを含めるか、そのコードを実行可能アプリケーションに直接含める必要があります。

参考資料:

MSDN > MSDN ライブラリ >テクニカルドキュメント > Windows Vista > Windows Presentation Foundation > Web における Windows Presentation Foundation: XAMLブラウザアプリケーション

MSDN > MSDN ライブラリ > .Net 開発 > .Net Framework 3.5 > .Net Framework > Windows Presentation Foundation >セキュリティ (WPF) > Windows Presentation Foundation 部分信頼セキュリティ

MCTS 問題1 / 10   REF:70-502VB.19264


Microsoft .NET 3.5 Frameworkを使って、Windows Presentation Foundation (WPF) ブラウザ アプリケーションを開発しています。 現在の作業環境では、UIの設計とコードの開発が別のチームによって行われています。 試用テストの目的を達成するため、MouseDown イベントが発生するたびに、そのログを myTextBox というテキストボックスに記録させる必要があります。

このプロジェクトは重要機密のため、すべてのイベント情報を UI設計チームから隠す必要があります。 どうすればいいですか? (2つ選択。 それぞれの正解は、ソリューションの一部です。)













解説:

要件を満たすには、次のコード セグメントを使用します。

AddHandler myTextBox.MouseDown, AddressOf GetData


Sub GetData(ByVal sender As Object, ByVal e As RoutedEventArgs)

'Log the MouseDown event

End Sub


上記要件によると、イベント情報を UI 設計者に知られないようにする必要があります。 このため、MouseDown イベントをXAMLコードに添付してはいけません。 コード ビハインド ファイルを使ってイベント ハンドラを添付する必要があります。 コード セグメントは MouseDown イベントを myTextBox オブジェクトに添付します。 UI 設計者は、イベント、またはイベント ハンドラについて全く知ることができません。

ルーティング イベントにイベントハンドラを関連させるには、XAML (Extensible Application Markup Language) に要素属性を指定するか、または標準のイベントと同様に、共通言語ランタイム (CLR) コード内のイベント ハンドラの関連性を指定します。 XAML では、次の構文を使用します。

<Element EventTypeName="EventHandlerName" />


ルーティング イベント処理では、ルーティング イベントがそのイベントを発生させた要素を超えて、複数の要素によって処理できるため、標準のイベント処理よりも高い信頼性を提供します。 ルーティング イベントは次の3つの要素ツリー メカニズムの内の1つで階層的に移動します。


  • バブルでは、イベントを発生させた要素から始まります。ここからルートまで、要素階層の上位に向かってに移動します。これは、最も一般的なメカニズムです。
  • トンネルは、要素階層のルートから始まります。ここから、イベントを発生させた要素まで、要素階層内を下位に向かって移動します。このメカニズムを使用する多くのイベントは、"preview" イベントとして知られています。
  • 直接、の要素は、イベントを発生させた要素だけがイベントを処理できます。このメカニズムはクラス処理をサポートします。
MouseDownプロパティと GetData メソッドを指定するマークアップを使用するのは間違いです。これは、MouseDown イベントに対するイベントハンドラを GetData メソッドに指定します。 シナリオの要件により、イベント処理情報をUI設計者から隠す必要があります。このため、すべてのイベント処理情報をコードビハインドファイルに含める必要があります。

Mouse.Down MouseDown.Mouse プロパティを指定するマークアップを使用するのは間違いです。TextBox 要素に対してこのようなイベントはありません。 MouseDown イベントを指定する必要があります。

AddMouseDownHandler メソッドを指定するコードを使用するのは間違いです。TextBox クラスにこのようなメソッドはありません。 コントロールに MouseDown イベントを添付するには、AddMouseDownHandler メソッドが使用されます。 AddMouseDownHandler 関数は、Mouse クラスの一部です。このケースで有効な構文は次の通りです。

Mouse.AddMouseDownHandler(myTextBox, GetData)


参考資料:

MSDN > MSDN ライブラリ > .Net 開発 > .Net Framework 3.5 > .Net Framework > Windows Presentation Foundation > WPF の基礎 > イベント (WPF) > 添付イベントの概要

MSDN > MSDN ライブラリ > .Net 開発 > .Net Framework 3.5 > .Net Framework > Windows Presentation Foundation > WPF の基礎 > イベント (WPF) > ルーティングイベントの概要

MCTS 問題1 / 10   REF:70-502VB.19265


Microsoft .NET 3.5 Framework を使って、Windows Presentation Foundation (WPF)アプリケーションを開発しています。 原子炉プラントの空圧ポンプを監視するために、PumpMonitor という名前のカスタム ユーザー コントロールを開発しました。 あなたは、XML Application Markup Language (XAML) で利用できるように、Failed というイベントを公開したいと考えています。

どうすればいいですか? (3 つ選択。 それぞれの正解は、ソリューションの一部です。)











解説:

Failed イベントをWPF イベント処理システムに公開するには、PumpMonitorクラスが次のようになっていなければなりません。

Partial Public Class PumpMonitor

Inherits UserControl

'Declare the event

Public Shared ReadOnly FailedEvent As RoutedEvent = _

EventManager.RegisterRoutedEvent("Failed", RoutingStrategy.Bubble, _

GetType(RoutedEventHandler), GetType(PumpMonitor))

'Declare the event handler

Public Custom Event Failed As RoutedEventHandler

AddHandler(ByVal value As RoutedEventHandler)

Me.AddHandler(FailedEvent, value)

End AddHandler

RemoveHandler(ByVal value As RoutedEventHandler)

Me.RemoveHandler(FailedEvent, value)

End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As RoutedEventArgs)

Me.RaiseEvent(e)

End RaiseEvent

End Event

'Raise the event

Private Sub RaiseFailedEvent()

RaiseEvent Failed(Me, New RoutedEventArgs(FailedEvent))

End Sub

End Class


イベントをルーティングイベントとして利用できるように XAML に公開するには、イベントを登録し、イベントハンドラ割り当てを有効にし、そして、最後にイベントを発生させます。 イベントを登録するには、EventManager.RegisterRoutedEventメソッドを使用します。最初の引数は名前を指定し、次の引数はルーティング メカニズムを示し、3番目の引数がイベントに関連したデリゲートになり、最後の引数が元のソース クラスを示します。 イベントが登録されると、このイベント処理を有効にする必要があります。 これは、イベント ハンドラ メカニズムを宣言する際に、AddHandler メソッドと RemoveHandler メソッドを指定することによって行います。 最後に、RaiseEvent メソッドを呼び出して、RoutedEventArgs インスタンス内でイベントを指定することによって、イベントを発生させます。

追加的な要素が同じようにイベント処理を実行できるように、イベントを添付されたプロパティとして公開したい場合、AddXXXHandlerRemoveXXXHandlerいうカスタムメソッドを追加して、イベント処理を割り当てる必要があります。 XXXは、イベントの名前を表しています。 メカニズムは他のイベント処理と同じですが、次のように、別の要素でAddHandler RemoveHandler を呼び出す必要があります。

Public Shared Sub AddFailedHandler(ByVal element As UIElement,

ByVal handler As RoutedEventHandler)

element.AddHandler(FailedEvent, handler)

End Sub

Public Shared Sub RemoveFailedHandler(ByVal element As UIElement,

ByVal handler As RoutedEventHandler)

element.RemoveHandler(FailedEvent, handler)

End Sub


イベントがWPF イベント処理システムに公開されたら、イベントハンドラをルーティング イベントに関連させます。 これには、XAML (Extensible Application Markup Language) で要素属性を指定するか、標準イベントと同じように共通言語ランタイム (CLR) コード内で指定します。このシナリオでは、次の構文を使用します。



ルーティング イベントは、そのイベントを発生させた要素を超えて、複数の要素によって処理できるため、ルーティングイベント処理は、標準のイベント処理よりも高い信頼性を提供します。 ルーティング イベントは次の3つの要素ツリー メカニズムの内の1つで階層的に移動します。


  • バブル – バブルは、イベントを発生させた要素から始まります。ここからルートまで、要素階層の上位に向かってに移動します。これは、最も一般的なメカニズムです。
  • トンネル - トンネルは、要素階層内のルートから始まります。ここから、イベントを発生させた要素まで、要素階層の下位に向かって移動します。このメカニズムを使用する多くのイベントは、"preview" イベントとして知られています。
  • 直接- 直接の要素は、イベントを発生させた要素だけがイベントを処理できます。このメカニズムはクラス処理をサポートします。
標準の共通言語ランタイム (CLR) イベント コードを使用してイベントをWPF イベント処理システムに公開するのは間違いです。この方法では、XAML内で要素のためのイベント ハンドラを設定することができません。 むしろ、RoutedEvent クラス、RoutedEventHandler クラス、RoutedEventArgs クラス、そしてEventManager クラスと、AddHandlerメソッド、RemoveHandlerメソッド、そしてRaiseEventメソッドを使用します。

参考資料:

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > WPF の基礎 > イベント (WPF) > ルーティング イベントの概要

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > WPF の基礎 > イベント (WPF) > ルーティング イベントの処理済みとしてのマーキング、およびクラス処理

MSDN ライブラリ > .NET Framework 3.5 > .NET Framework ライブラリ > System.Windows 名前空間 > EventManager クラス > EventManager メソッド > RegisterRoutedEventメソッド

MCTS 問題1 / 10   REF:70-502VB.19266


Microsoft .NET 3.5 Framework を使って、XAML ブラウザ アプリケーション (XBAP)を開発しています。アプリケーションは、ConfirmOrder.xaml というページ関数を使って、ユーザーに注文を確認させています。 ConfirmOrder.xaml は、次のように定義されています。

<PageFunction

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:sys="clr-namespace:System;assembly=mscorlib"

x:Class="BrowserApp.ConfirmOrder" x:TypeArguments="sys:String"

Title="Confirm Order" Width="200">

<DockPanel LastChildFill="False">

<TextBlock DockPanel.Dock="Top">Please review the following:</TextBlock>

<StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">

<Button IsDefault="True" Content="Accept" Width="100" Click="Accept_Click" />

<Button IsCancel="True" Content="Cancel" Width="100" Click="Cancel_Click" />

</StackPanel>

</DockPanel>

</PageFunction>


既定のコンストラクタを使用してページ関数を呼び出し、戻り引数を取得する必要があります。 どうすればいいですか? (2つ選択。 それぞれの正解は、ソリューションの一部です。)













解説:

既定のコンストラクタを使用してページ関数を呼び出し、戻り引数を取得するには、ページ関数をインスタンス化し、Return イベントハンドラを割り当て、次のように結果を取得します。

Private Sub ConfirmOrder_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)

Dim pageFunction As New ConfirmOrder()

AddHandler pageFunction.Return, ConfirmOrder_Return

NavigationService.Navigate(pageFunction)

End Sub

Private Sub ConfirmOrder_Return(ByVal sender As Object, ByVal e As ReturnEventArgs(_

Of String))

OrderStatus.Text = e.Result

End Sub


XAML マークアップは次を格納する必要があります。

<Button Click="ConfirmOrder_Click">Confirm Order</Button>

<TextBlock Name="OrderStatus" />


ユーザーがボタンをクリックすると、ConfirmOrder_Click というClickイベントハンドラが呼び出されます。 ConfirmOrder_Click メソッドはページ関数オブジェクトをインスタンス化し、Return イベントを ConfirmOrder_Returnメソッドに関連させます。 NavigationService クラスでNavigate メソッドが呼び出され、ページ関数オブジェクトを指定します。 ユーザーがConfirmOrder.xaml ページで必要なタスクを実行すると、ナビゲーション サービスは元の呼び出し元ページに戻ります。 Return イベントが発生し、これは ConfirmOrder_Return メソッドを呼び出します。 ReturnEventArgs インスタンス内のResultプロパティは、ページ関数の結果を保存します。

WPF での構造化ナビゲーションは、PageFunction(T)クラスに基づいています。 PageFunction(T) クラスは、入力をコンストラクタ引数として受け付け、type パラメータで指定された通りに戻り引数を出力します。 XAML マークアップでは、Page要素が PageFunction 要素に置き換えられます。 PageFunction要素は x:TypeArguments属性を含めて、戻り引数の型を示します。 ページ関数から戻り値を受信するには、Return イベントと ReturnEventArgs.Result プロパティを使用します。

Hyperlink 要素のNavigateUri 属性を使用する、XAMLマークアップフラグメントを使用するのは間違いです。これは標準のナビゲーションが、ページ関数の戻り値を取得することを許可しないためです。 また、有効なURIを値として指定する必要があり、ページ関数をインスタンス化することができません。 ここでは、イベント ハンドラを Return イベントに関連させるNavigationService.Navigateメソッドを使用して、ページ関数にナビゲートする必要があります。

ConfirmOrder クラスをインスタンス化せず、Return イベントにメソッドを関連させないコード フラグメントを使用するのは間違いです。これでは、ConfirmOrder_Return メソッドが呼び出されません。また、NavigationService.Navigate メソッドではなく、ReturnEventArgs.Result プロパティを使用して、戻り値を取得する必要があります。

参考資料:

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > アプリケーション 開発 > Windows Presentation Foundation アプリケーションのナビゲーション > ナビゲーションの概要

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > アプリケーション 開発 > Windows Presentation Foundation アプリケーションのナビゲーション > 構造化ナビゲーション

MSDNライブラリ > .NET Framework 3.5 > .NET Framework ライブラリ > System.Windows.Navigation 名前空間 > PageFunction<(Of <(T>)>) クラス

MSDN ライブラリ > .NET Framework 3.5 > .NET Framework ライブラリ > System.Windows.Navigation 名前空間 > NavigationServiceクラス

MCTS 問題1 / 10   REF:70-502VB.19267


Microsoft .NET 3.5 Frameworkを使って、XAML ブラウザアプリケーション(XBAP) を開発しています。 Resources.xaml ページを以下のように設計しました。

<Page x:Class="BrowserApp.Resources"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="WPF Resources">

<DockPanel >

<DockPanel.Resources>

</DockPanel.Resources>

<Grid DockPanel.Dock="Top">

<Grid.ColumnDefinitions>

</Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height="Auto" />

</Grid.RowDefinitions>

<TextBox Grid.Column="0" Grid.Row="0">Title</TextBox>

<TextBox Grid.Column="1" Grid.Row="0">Location</TextBox>

<TextBox Grid.Column="2" Grid.Row="0">Rank</TextBox>

</Grid>

<ScrollViewer>

<Grid>

<Grid.ColumnDefinitions>

</Grid.ColumnDefinitions>

<Grid.RowDefinitions>

</Grid.RowDefinitions>

<TextBlock Name="BestResource" Grid.Column="0"

Grid.Row="50" Text="WPF and you" />

<TextBlock Grid.Column="1" Grid.Row="100" Text="Book" />

<TextBlock Grid.Column="2" Grid.Row="100" Text="1" />

</Grid>

</ScrollViewer>

</DockPanel>

</Page>


あなたは、アプリケーション内の別ページから、BestResourceという TextBlock 要素にナビゲートしたいと考えています。

どうすればいいですか? (2つ選択。各解答は、それぞれ完全なソリューションです。)













解説:

ページの指名されたフラグメントにナビゲートするには、次の構文を使用します。

Page.xaml#PageFragmentName

黙示的または明示的にNavigationService クラスを使用して、ナビゲートすることができます。 NavigationService クラスを黙示的に使用するには、Hyperlink 要素で NavigateUri を指定します。 NavigationService クラスを明示的に使用するには、URI引数に同じ値を指定するように Navigate メソッドを呼び出します。 WPFのジャーナルでは、ページのナビゲーション履歴を保存して、GoBack メソッドやGoForward メソッドを使用できるようになっています。

Windows Presentation Foundation (WPF)ナビゲーションシステムは、スタンドアロンアプリケーションやXAMLブラウザアプリケーション (XBAP) に、ブラウザ スタイルのコンテンツ連結を提供します。 コンテンツのブラウジングを可能にするには、Window クラスではなく、Pageクラスを使用します。 Hyperlink 要素は、統一リソース識別子 (URI)を使用しているページへの宣言リンクに使用されます。 NavigationServiceクラスは、ページナビゲーションを提供する際に元になるメカニズムで、ジャーナルを履歴用ストレージとして使用します。

その他の選択肢はいずれも、構文的に誤りがあるので使用しません。 ページの指名されたフラグメントにナビゲートするには、構文Page.xaml#PageFragmentNameを使用します。

参考資料:

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > アプリケーション 開発 > Windows Presentation Foundation アプリケーションのナビゲーション > ナビゲーションの概要

MSDN ライブラリ > .NET Framework 3.5 > .NET Framework ライブラリ > System.Windows.Navigation 名前空間 > NavigationServiceクラス

MCTS 問題1 / 10   REF:70-502VB.19268


Microsoft .NET 3.5 Framework を使って、Windows Presentation Foundation (WPF)アプリケーションを開発しています。 アプリケーションは工業用製紙工場で、特化作業を行うマシンを構成するために、さまざまなウィンドウを提供します。 アプリケーション定義ファイルは、次のマークアップを格納しています。

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

x:Class="IndustrialApp" />


アプリケーションは、構成を必要とするマシン上に適切なウィンドウベースをロードする必要があります。 アプリケーションを起動するときに、コマンドラインで次のようにマシンが指定されます。

MachineConfigApp /machine:EdgeMiller

コマンドライン引数を処理するには、次のどのコードを IndustrialApp クラスに追加すればいいですか?









解説:

IndustrialApp クラスでコマンドライン引数を処理するには、Startup イベントを以下のように使用します。

Public Sub New()

AddHandler Me.Startup, AddressOf IndustrialApp_Startup

End Sub

Sub IndustrialApp_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)

Dim startupWin As String

If e.Args.Length > 0 Then

startupWin = e.Args(0).Remove(0, "/machine:".Length)

Else

startupWin = "Default"

End If

Me.StartupUri = New Uri(startupWin & ".xaml", UriKind.Relative)

End Sub


最初に、コードがイベント ハンドラをアプリケーションの Startup イベントに割り当てます。 Startupイベントは、コマンドライン引数を提供するために、StartupEventArgs 引数を提供します。 Args プロパティは、アプリケーションのコマンドライン実行から得られるスペース区切りの値の文字列コレクションです。 コードは、存在するコマンドライン引数を検証した後、最初の引数を取得してStartupUri プロパティを割り当てて、アプリケーションの起動時にロードするウィンドウを示します。 アプリケーション定義ファイルからのマークアップを元にして、コンパイル中に以下のメソッドが生成されます。

<System.STAThreadAttribute(), _

System.Diagnostics.DebuggerNonUserCodeAttribute()> _

Public Shared Sub Main()

Dim app As New IndustrialApp

app.Run()

End Sub


既定により、このコードはパーシャルクラス IndustrialApp に配置されて、アプリケーションをインスタンス化し、Run メソッドを呼び出します。

Application クラスは、インフラストラクチャ、有効期間、コマンドライン パラメータ管理、スコープ プロパティとリソース、一元化されたエラー処理と終了コード、そしてナビゲーションとウィンドウ管理サービスを提供します。 Applicationクラスから継承するクラスを定義して明示的にコードを生成するか、マークアップでApplication 要素を使用することができます。 XAML (Extensible Application Markup Language) ファイルでApplication 要素を使用している場合、Build Action プロパティを ApplicationDefinition に設定する必要があります。

Startupイベントを使用しないコードセグメントを追加するのは間違いです。アプリケーションでコマンドライン引数を使用するには、イベント ハンドラを Startup イベントに割り当てる必要があります。

Mainメソッドでコマンドライン引数を取得することを試みるコードを追加するのは間違いです。このメソッドは、アプリケーション定義マークアップに示されるように、アプリケーションを開始する必要があります。 また、StartupUri プロパティを割り当てるためにApplication インスタンスを指定する必要があります。これは、このプロパティがクラス メンバではなく、インスタンス メンバであるためです。

Startメソッドを定義するコードを追加するのは間違いです。このメソッドはアプリケーションが開始するときに呼び出されないため、Startup イベント ハンドラの署名に一致しません。 Startup イベント ハンドラの署名に一致するメソッドを定義して、そのメソッドを Startup イベントに割り当ててコマンドライン引数を処理します。

参考資料:

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > アプリケーション 開発 > アプリケーション管理 > アプリケーション管理の概要

MSDN ライブラリ > .NET Framework 3.5 > .NET Framework クラス ライブラリ > System.Windows 名前空間 > Application クラス

MCTS 問題1 / 10   REF:70-502VB.19269


Microsoft .NET 3.5 Framework を使って、Windows Presentation Foundation (WPF)アプリケーションを開発しています。 アプリケーションは、米国国税庁提携データベースから税金関連情報をロードして、メイン ウィンドウに公開します。 各税金申告書が、フィールドごとにロードされ、プロセスを小さなタスクに分割します。

メイン ウィンドウ内の以下のメソッドは、各税金フィールドを取得して関連しているコントロールを公開します。

Public Sub LoadTaxData()

'Retrieves data and populates controls

End Sub


あなたは、LoadTaxData メソッドが呼び出される際のアプリケーションの応答性を、高い状態に維持させたいと考えています。 どうすればいいですか?









解説:

LoadTaxData メソッドを呼び出す際にアプリケーションの高い応答性を維持するには、デリゲートがLoadTaxData メソッド署名に一致することを宣言し、Dispatcher オブジェクトを使用して非同期的にデリゲートを呼び出す必要があります。次のようになります。

'Delegate declaration

Public Delegate Sub LoadTaxDataDel()

'Dispatch asynchronous invocation

Me.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, _

New LoadTaxDataDel(AddressOf LoadTaxData))


Dispatcher オブジェクトのBeginInvoke メソッドを使用することにより、非同期的な呼び出しを行っていることになり、実行は直ちにメインウィンドウに返されます。 DispatcherPriority列挙値をSystemIdleに指定すると、LoadTaxData メソッドを呼び出す際もアプリケーションの高い応答性を保証できるようになります。

WPF アプリケーションは、少なくとも2つのスレッドを格納します。レンダリングスレッドと UIスレッドです。レンダリングスレッドはバックグラウンドで実行されます。 UI スレッドは、フォアグラウンドで入力/出力とアプリケーション コードを処理します。 入力/出力とアプリケーション タスクは、 Dispatcher オブジェクト内でタスクが完了するまでキューに並びます。 一元化されたキューの使用は、マルチスレッド環境内で相互排除を可能にし、プログラムの同期テクニックを解決します。 各タスクには、割り当てられた優先順位があり、優先順位の高い項目がキューで前に並べられます。 アプリケーション タスクのサイズを削減すると、更に多くの入力/出力 タスクの実行を実現できるようになり、その結果、ユーザー応答性を向上させることができるようになります。

Dispatcherオブジェクトは、ほとんどのWPF クラスでDispatcher プロパティを通じて使用することができます。これは、これらの WPF クラスがDispatcherObject クラスを実装するためです。 Dispatcher クラスは、同期および非同期メソッドの両方を格納して、次の 2 つのメソッドを呼び出します。 Invokeメソッドと BeginInvoke メソッドです。 Invokeメソッドは、メソッドが完了するまでその先の実行をブロックします。これに対し、BeginInvoke はメソッドが実行されている間に、実行を呼び出しコードに返します。 両方のメソッドとも、キュー内でタスクに割り当てられた優先順位を示すために、DispatcherPriority列挙値を受け付けます。 列挙体は、次の便利な優先順位レベルを格納します。


  • SystemIdle: 最も低い優先順位です。コンピュータシステムがアイドル状態のときだけにタスクを実行します。
  • ApplicationIdle: アプリケーションがアイドル状態のときにタスクを実行します。
  • ContextIdle: バックグラウンドタスクがすべて完了した後で、このタスクを実行します。
  • Background: 非アイドルタスクがすべて完了した後で、このタスクを実行します。
  • Input/Render: 操作は、入力/レンダリングと同じ優先順位で実行されます。
  • Loaded: レイアウトとレンダリングがすべて完了した後で、このタスクを実行します。
  • Normal: このタスクは、特別な優先順位の無い状態で実行されます。このタスクは、アイドル状態やバックグラウンドの優先順位を持つタスクの前に実行されますが、高い優先順位のタスクのよりも前に実行されることはありません。
  • Send: 最も高い優先順位です。他の非同期タスクの前に、このタスクを実行します。
DispatcherPriority.Normal 値を使用するコードを使用するのは間違いです。なぜなら、このシナリオではアプリケーションの高い応答性を保証する必要があるからです。 この優先順位は多くのタスクにとって良い選択肢ですが、メイン ウィンドウに関連するタスクと競合することになります。 ここでは、アプリケーションの応答性の方がLoadTaxData メソッドの完了時間よりも重要なため、このメソッドを最も低い優先順位で呼び出したいと考えます。

Dispatcher.Invokeメソッドを呼び出すコードを使用するのは間違いです。これは、実行が直ちにメイン ウィンドウに返されることを保証する必要があるためです。 Invokeメソッドは、メソッドが完了するまでその先の実行をブロックします。これに対し、BeginInvoke はメソッドが実行されている間に、実行を呼び出しコードに返します。

参考資料:

MSDNライブラリ > .NET Framework 3.5 > Windows Presentation Foundation > スレッド モデル

MSDN ライブラリ > .NET Framework 3.5 > .NET Framework クラス ライブラリ > System.Windows.Threading 名前空間 > Dispatcher クラス

MSDN ライブラリ > .NET Framework 3.5 > .NET Framework クラス ライブラリ > System.Windows.Threading 名前空間 > DispatcherPriority列挙体

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。