21
小尾 智之(Ahf)

Pronama 0707 wf4

Embed Size (px)

Citation preview

Page 1: Pronama 0707 wf4

小尾 智之(Ahf)

Page 2: Pronama 0707 wf4

小尾 智之(Ahf)

Page 3: Pronama 0707 wf4

自己紹介

・ハンドル:Ahf・Twitter : @twit_ahf・Facebook : 小尾 智之

(Tomoyuki Obi)・@IT自分研究所:エンジニアライフに生息中

Page 4: Pronama 0707 wf4

Workflow Foundation を知っていますか?

Page 5: Pronama 0707 wf4

.NET 界隈の中でも「使い道がわからねぇ」「コード書いた方が楽でね?」と開発者から違う方向で絶賛されるフレームワークです。

Page 6: Pronama 0707 wf4

どれくらい絶賛されているかというと

これほどまでの人気っぷりです!

Page 7: Pronama 0707 wf4

ちなみに海外だと

まだマシですが、あくまでマシです

Page 8: Pronama 0707 wf4

そんな WF4 の特徴とは?

Page 9: Pronama 0707 wf4

これ!

Page 10: Pronama 0707 wf4

アクティビティ(≒コンポーネント)による記述

Page 11: Pronama 0707 wf4

ある程度まとまった処理単位をアクティビティと呼ばれるコンポーネント単位に隠蔽

ビジュアルデザイナー上でアクティビティを配置することでアプリを作成

コード書かなくてもアプリが作れる!

Page 12: Pronama 0707 wf4

ということで紙芝居を作ってみる

Page 13: Pronama 0707 wf4

紙芝居の要素(簡易版)

シナリオ

コントローラ

画像

シナリオの内容に沿って画像や文字をコントローラが表示制御を行う

Page 14: Pronama 0707 wf4

用意が必要な要素

• 自前での用意が必要なもの• メイン画面の開始、終了• 画像の表示• 文章の表示• 選択肢の表示

• WF4で用意されている物• フラグの設定(Assignアクティビティ)• 条件判断(IF / Switchアクティビティ)

Page 15: Pronama 0707 wf4

Public Class WPFWindowActivityInherits CodeActivity

Public Property Window As InArgument(Of Window)Public Property SetTopMost As InArgument(Of Boolean) = TruePublic Property SetFullScreen As InArgument(Of Boolean) = False

Protected Overrides Sub Execute(context As CodeActivityContext)

Dim target = context.GetValue(Me.Window)target.Topmost = context.GetValue(Me.SetTopMost)If context.GetValue(Me.SetFullScreen) Then

target.WindowStyle = WindowStyle.Nonetarget.WindowState = WindowState.Maximized

End Iftarget.Show()

End SubEnd Class

WPF の Window 表示アクティビティのサンプル

Page 16: Pronama 0707 wf4

Public Property DelayTime As InArgument(Of Integer) = 5Public Property StartValue As InArgument(Of Double) = 0Public Property EndValue As InArgument(Of Double) = 1-------------------------------------------(省略)-----------------------------------------------------Dim fadeinAnime As New DoubleAnimation With {

.From = sValue, .To = eValue,

.Duration = New Duration(TimeSpan.FromSeconds(delay))}

Dim fadeinStoryboard As New StoryboardfadeinStoryboard.Children.Add(fadeinAnime)Storyboard.SetTargetName(fadeinAnime, contentName)Storyboard.SetTargetProperty(fadeinAnime, New PropertyPath(UIElement.OpacityProperty))AddHandler fadeinStoryboard.Completed, AddressOf StateInvalidatedfadeinStoryboard.Begin(displayObject)

Do Until _commitAnimeDispatcherHelper.DoEvents()

Loop-------------------------------------------(省略)-----------------------------------------------------Private _commitAnime As Boolean = FalsePrivate Sub StateInvalidated(ByVal sender As Object, ByVal e As EventArgs)

_commitAnime = TrueEnd Sub

画像のフェードイン表示アクティビティのサンプル

Page 17: Pronama 0707 wf4

<EventTrigger ><BeginStoryboard>

<Storyboard ><DoubleAnimation

Storyboard.TargetName="imageview“Storyboard.TargetProperty="Opacity"FillBehavior="HoldEnd“From="0" To="1"Duration="0:0:5" />

</Storyboard></BeginStoryboard>

</EventTrigger>

画像のフェードイン表示xaml で同じことをやる場合

Page 18: Pronama 0707 wf4

WF4 での注意点

• 基本は AsyncCodeactivity による非同期処理• 画面操作は全て Invoke で行う必要がある• 色々な処理を非同期で行う事は大前提

• WindowsForms でも WPF でも利用可能• WPFの場合は xaml 上での処理をコードで

やる必要が出てくるのでやや大変• WindowsForms では同期コンテキストの

問題が発生しまくりでもっと大変。死ねる。• SynchronizationContext 近辺を理解して

いて自力でキューイングし処理するような仕組みを作れる人ならOK

Page 19: Pronama 0707 wf4

WF4 を利用するメリット

• ワークフローで全てを定義するのでプログラムのリビルド等を行わずに修正ができる

• 専門的なプログラム知識がなくてもアプリケーションの作成が行える

• デザイナリホスティングが公開されているのでVisualStudio がない環境でもワークフローを扱わせるアプリを用意することもできる

Page 20: Pronama 0707 wf4

まとめ

• WF4 で WindowsForms / WPF を利用するには非同期プログラミングが必要

• その点を除けばワークフロー化した制御は非常に見やすく開発者以外でも利用できる

• アクティビティを多く用意できればもっと凝ったことも簡単に利用してもらえる

• WFの動作性質があるのでリアルタイム性を求めるものには不向き

Page 21: Pronama 0707 wf4

ご清聴ありがとうございました