デザインモードの判断
現在のサーバの稼働状況を確認するために、Silverlightのページが読み込まれたタイミングで、サーバ側のサービスを呼び出したいことがありますが、Visual StudioやExpression BlendでSilverlightのデザイン画面を開いている場合は注意が必要です。
Visual StudioでもExpression Blendでも、ページのロード時のイベント自体はデザイナの裏で動いているため、サーバのリソースを利用してページの初期化処理を行っている場合は、図1のようなエラーがデザイナ上に表示されて、デザイナが利用できなくなってしまいます。
このような場合、リスト3のようにDesignerPropertiesクラスのIsInDesignToolプロパティを参照して、デザイン時には実行しないといった処理を記述することが可能です。
// 動作モードによって初期化処理を切り替える。 if (DesignerProperties.IsInDesignTool) { // デザイナ用の初期化コード } else { // 実行時の初期化コード }
ビヘイビア
ページが読み込まれたタイミングでページに検索した値を表示したい場合、通常であれば、ページのLoadedイベントが発生したタイミングで検索処理を実行します。しかし、前述のとおり、コマンドバインディングは、ICommandSourceインターフェイスを実装したコントロールでなければ利用できません。
Loadedイベント発生時にコマンドを実行する一番簡単な方法は、Blend SDKに含まれるInvokeCommandActionビヘイビアを利用する方法です。
Expression Blendを利用して、LayoutRootのLoadedイベント発生時にInvokeCommandActionビヘイビアでコマンドを実行する場合は、AssetライブラリのInvokeCommandActionビヘイビアをLayoutRootsにドロップします(図2)。
ビヘイビアのプロパティで、EventNameをLoadedとしてイベントと関連を設定します(図3)。
図3のようにコマンドプロパティペインのバインディングアイコンを押して、バインドしたいコマンドを選択すれば、バインディングの設定は完了です。
この設定をすると、リスト4のようなXAMLがExpression Blendによって記述されます。
<UserControl ... 略 ... xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" > <StackPanel x:Name="LayoutRoot" DataContext="{StaticResource vm}"> <i:Interaction.Triggers> <i:EventTrigger> <i:InvokeCommandAction Command="{Binding 検索Command, Mode=OneWay}"/> </i:EventTrigger> </i:Interaction.Triggers> ... 略 ... </StackPanel> </UserControl>
ビヘイビアには、Silverlightの標準ライブラリに含まれるビヘイビアと、Expression Blend SDKに含まれるビヘイビアの2種類があります。Blend SDKに含まれるビヘイビアは、開発者が拡張しやすく利用しやすいように設計し直されたものです。Expression Blendを持っていなくてもBlend SDKは無料で利用できるので、Exression Blendを持っていない方はここからダウンロードして利用してください。