2013年06月16日

WPFサンプル:プロパティトリガーでコントロールのプロパティ値を変更する

   このエントリーをはてなブックマークに追加 Clip to Evernote
プロパティトリガーを使うと、あるプロパティの値が変化した時に、別のプロパティの値を変更することができます。トリガーの条件が満たされなくなると、自動的に前の状態に戻ります。
領域にマウスポインタが入ったかどうかを検出する」で、MouseEnter, MouseLeave イベントを使い、 コントロールの上にマウスが来た時に、Rectangleの見た目を変化させるサンプルをお見せしましたが、 プロパティトリガーを使っても同様のことが可能です。

ここでお見せする例は、ButtonのIsMouseOverプロパティが、trueに変更された時に、HeightとForegroundプロパティの値を変更する例です。

イベントでは、コードビハインドにイベントハンドラを記述する必要がありましたが、 Triggerを使うと、XAMLだけでこれが可能になります。

XAMLをお見せします。


XAMLを見ていただければお分かりになると思いますが、Styleを定義しています。
StyleのTriggersタグで、対象となるプロパティと、そのプロパティ値が変更になったら、 どのプロパティ値をどう変えるのかを指定しています。

以下実行結果です。

propertyTriger1
propertyTriger2
propertyTriger3

注意すべき点は、 Buttonタグで、 Height, Foreground プロパティの値を設定してある場合は、トリガーが有効に働かないということです。そのため、ボタンの高さの初期値を変更したい場合は、 Style で初期値を指定してあげる必要があります。
上の例でも、StyleでHeight値を 40 にして高さを変更しています。


この記事へのコメント
トリガーでプロパティ値を変更しようと私もいろいろと試しました。このページで「 Buttonタグで、 Height, Foreground プロパティの値を設定してある場合は、トリガーが有効に働かないということです。」という記述をみて、おお!と思いましが、わたしの問題は解決しませんでした。
わたしは、VisualStudio2013forWindowsDesktopExpressをしようして、このページとほぼ同じコードで、Backgroundの値を変更しようとしました。通常のボタンのBackgroundは変更されますが、IsMouseOver、IsPressedともに指定した色では表示されません。規定と同じLigthBlueになります。一緒に指定したHeightとWidthはちゃんと変更されます。
何か情報をお持ちでしたら、追記していただけるとうれしいです。
Posted by kukkeko at 2014年02月19日 00:22
kukkekoさん、私の拙い記事を読んでいただきありがとうございます。
残念ながら、プロパティ値を変更する方法については、これ以上の情報を持ち合わせていません。
これを実現するには、VisualStateManagerを使う方法が考えられます。
http://gushwell.ldblog.jp/archives/52336247.html


Posted by Gushwell at 2014年02月19日 22:21
お返事ありがとうございます。VisualStateManager試して見ます。
WPFを使えるなろうと試行錯誤していますが、難しいです。ココロが折れそうです。GushwellさんのようにWPFの機能を紹介してくれるページを作成してくださっている方々には、とても感謝しています。
WPFは難しいです。
msdnをはじめ、web上の動作しないWPFコードとビハインドコードに不思議な思いをしてきました。昨日、やっと、原因がわかりました。ホームアプリケ−ションとデスクトップアプリケーションのWPFに完全な交換性がなく、別のVisual Studioにプロジェクトを開くとエラーが発生します。これに気がつかずに、書籍の質問欄にクレームじみた質問をしていまい、後悔と恥ずかしい気持ちでいっぱいになりました。

まだ、私はこの程度の能力しかありません。Gushwellさんのページにとても助けられています。
では。
Posted by kukkeko at 2014年02月22日 11:12
kukkekoさん、僕のブログが少しはお役に立っているようで嬉しいです(^^)
Posted by Gushwell at 2014年02月22日 22:13
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52323268