Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
Search
Ryosuke Uchiyama
June 04, 2021
Technology
54
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
Ryosuke Uchiyama
June 04, 2021
More Decks by Ryosuke Uchiyama
See All by Ryosuke Uchiyama
AWSでサーバレスな書籍管理アプリを作る
step63r
0
58
PythonでSlack通知botを作る
step63r
0
22
ChatGPT実践
step63r
1
390
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
35
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
25
深層強化学習で東方AI 第一章 DQNの基本
step63r
0
310
Build 2021 プレイバック
step63r
0
38
WPFで実践アプリ開発! 第三章 機能の実装 Part 1
step63r
0
130
WPFで実践アプリ開発! 第二章 UI
step63r
0
180
Other Decks in Technology
See All in Technology
侵入は突然に 〜 IoTマルウェアと悪用される家庭の機器 ~ / When Intrusion Strikes: IoT Malware and the Abuse of Home Devices
nttcom
0
5.9k
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
My broken English still works: speaking at global OSS events
naruoga
0
100
『三匹の子ぶた』から学ぶネットワークセキュリティの昔と今 / Network Security: Then and Now Through the Lens of The Three Little Pigs
nttcom
1
6.1k
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
230
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
1
5.9k
モダンフロントエンド 開発研修
recruitengineers
PRO
4
670
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
330
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.6k
20分でわかるセキュアAPI
nwiizo
2
280
Model Studio CLI × Token Plan
maigo999
0
180
同じWAFが、攻撃の“形”は弾く── 正当な“形”の不正は通す
kuroneko13
0
210
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
How to Ace a Technical Interview
jacobian
281
24k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
490
Marketing to machines
jonoalderson
1
5.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
960
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
460
Color Theory Basics | Prateek | Gurzu
gurzu
0
420
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
KATA
mclloyd
PRO
35
15k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Transcript
WPFで実践アプリ開発! 第四章 機能の実装 Part 2 Ryosuke Uchiyama step63r
ToDoWpf • やることリストを表示するアプリケーション • 「やること」を追加、削除、編集する機能 • 期日や優先度でソートする機能 • 期限切れを可視化する機能 •
通知領域に常駐する機能 • 詳細メモを登録する機能 • and so on... 前 回 の あ ら す じ
UIとロジックを分離するためのソフトウェアアーキテクチャパターン • Model • アプリケーションのデータと手続き(ビジネス ロジック)を表現する • Modelの情報はViewModelを介してViewへ伝達 される •
Model自身はViewの描画を知らない(知る必要 がない) • View • UIへの入力とUIからの出力を担当する • ViewModelに含まれたデータをデータバイン ディング機構などによって自動的に描画する • Viewそのものに複雑なロジックは含まない • ViewModel • ViewとModelの間の情報伝達を担当する • ViewModelの変更は自動的にViewへ反映される 前 回 の あ ら す じ
アプリケーション設定 // 設定値の保存 Properties.Settings.Default.SomeValue = "This is a setting value";
Properties.Settings.Default.Save(); // 設定値の読み込み string someValue = Properties.Settings.Default.SomeValue; 前 回 の あ ら す じ
期限超過かどうかを判定する ValueConverterクラスを作成 internal class IsPastDayConverter : IValueConverter { public object
Convert(object value, Type targetType, object parameter, CultureInfo culture) { // データ -> 表示データへの変換 } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { // 表示データ -> データへの変換 } } スタイルで実装 <DataTrigger Binding="{Binding Path=DueDate, Converter={StaticResource IsPastDayConverter}}" Value="True"> <Setter Property ... /> </DataTrigger> 前 回 の あ ら す じ
ソースコード step63r/ToDoWpf https://github.com/step63r/ToDoWpf
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
Hardcodet.NotifyIcon.Wpf https://github.com/hardcodet/wpf-notifyicon
通知領域の実装
アプリケーション終了のキャンセル
通知領域のメニューイベント
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
ウィンドウサイズの保存と復元
ウィンドウ領域 プライマリ モニター セカンダリ モニター
ウィンドウ領域 - WorkArea プライマリ モニター セカンダリ モニター WorkArea
ウィンドウ領域 - PrimaryScreen プライマリ モニター セカンダリ モニター PrimaryScreen
ウィンドウ領域 - VirtualScreen プライマリ モニター セカンダリ モニター VirtualScreen VirtualScreen
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
新規作成、編集のダイアログを作る MainWindowView TaskDialogView
ダイアログ表示方法の検討 • Prism.Wpf(MVVM)で気軽にMessageBoxをShowしたい – Qiita • MVVMな設計でVMからダイアログ表示を行う - SourceChord •
MVVMでViewModelから別ウィンドウ表示をするサンプル~シンプルなTODOリスト~ - SourceChord • MVVMでダイアログを表示したいときどうする? - present • 【WPF】MessageBoxを自作してViewModelから表示する | IT記録 • MVVMでファイルを開くダイアログを使う(View完結とViewModel経由) - かずきのBlog@hatena • MVVM的に真っ当にMessageBoxを表示する - 銀の弾丸 Messangerパターン ビヘイビア サービスインジェクション DataTrigger Interaction Request
今回の設計指針 – ウィンドウを開く MVVMな設計でVMからダイアログ表示を行う - SourceChord (hatenablog.com)
今回の設計指針 – ウィンドウを閉じる VMからウィンドウを閉じる添付ビヘイビア - SourceChord (hatenablog.com)
POINT ウィンドウ(親)は自分が開くダイアログ(子)を知っている ダイアログ(子)は自分を開いたウィンドウ(親)を知らない
まとめ
MVVMパターンを使ったWPF開発 • Windowsアプリ開発はWin32から着実に進化を遂げてきた • WPFはデータの双方向バインドに特化したフレームワーク • MVVMパターンを使うとUIとロジックを分離した設計ができる • UI/ロジックの分離により、UI改善、機能追加、テストが簡単になる •
WPFではUI要素を柔軟にカスタマイズできる • Windowsに特化したアプリ開発はWPFを最後に幕を閉じた • これからはWebとマルチプラットフォームが台頭すると思われる
None