Upload
tomoyuki-obi
View
366
Download
0
Embed Size (px)
Citation preview
小尾 智之(Ahf)
小尾 智之(Ahf)
自己紹介
・ハンドル:Ahf・Twitter : @twit_ahf・Facebook : 小尾 智之
(Tomoyuki Obi)・@IT自分研究所:エンジニアライフに生息中
Workflow Foundation を知っていますか?
.NET 界隈の中でも「使い道がわからねぇ」「コード書いた方が楽でね?」と開発者から違う方向で絶賛されるフレームワークです。
どれくらい絶賛されているかというと
これほどまでの人気っぷりです!
ちなみに海外だと
まだマシですが、あくまでマシです
そんな WF4 の特徴とは?
これ!
アクティビティ(≒コンポーネント)による記述
ある程度まとまった処理単位をアクティビティと呼ばれるコンポーネント単位に隠蔽
ビジュアルデザイナー上でアクティビティを配置することでアプリを作成
コード書かなくてもアプリが作れる!
ということで紙芝居を作ってみる
紙芝居の要素(簡易版)
シナリオ
コントローラ
画像
シナリオの内容に沿って画像や文字をコントローラが表示制御を行う
用意が必要な要素
• 自前での用意が必要なもの• メイン画面の開始、終了• 画像の表示• 文章の表示• 選択肢の表示
• WF4で用意されている物• フラグの設定(Assignアクティビティ)• 条件判断(IF / Switchアクティビティ)
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 表示アクティビティのサンプル
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
画像のフェードイン表示アクティビティのサンプル
<EventTrigger ><BeginStoryboard>
<Storyboard ><DoubleAnimation
Storyboard.TargetName="imageview“Storyboard.TargetProperty="Opacity"FillBehavior="HoldEnd“From="0" To="1"Duration="0:0:5" />
</Storyboard></BeginStoryboard>
</EventTrigger>
画像のフェードイン表示xaml で同じことをやる場合
WF4 での注意点
• 基本は AsyncCodeactivity による非同期処理• 画面操作は全て Invoke で行う必要がある• 色々な処理を非同期で行う事は大前提
• WindowsForms でも WPF でも利用可能• WPFの場合は xaml 上での処理をコードで
やる必要が出てくるのでやや大変• WindowsForms では同期コンテキストの
問題が発生しまくりでもっと大変。死ねる。• SynchronizationContext 近辺を理解して
いて自力でキューイングし処理するような仕組みを作れる人ならOK
WF4 を利用するメリット
• ワークフローで全てを定義するのでプログラムのリビルド等を行わずに修正ができる
• 専門的なプログラム知識がなくてもアプリケーションの作成が行える
• デザイナリホスティングが公開されているのでVisualStudio がない環境でもワークフローを扱わせるアプリを用意することもできる
まとめ
• WF4 で WindowsForms / WPF を利用するには非同期プログラミングが必要
• その点を除けばワークフロー化した制御は非常に見やすく開発者以外でも利用できる
• アクティビティを多く用意できればもっと凝ったことも簡単に利用してもらえる
• WFの動作性質があるのでリアルタイム性を求めるものには不向き
ご清聴ありがとうございました