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
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
1
5.9k
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
610
制約理論(ToC)入門 2026版
recruitengineers
PRO
8
2.3k
【AG-UI × A2UI × MCP Apps】Generative UIをやさしく解説する
nrinetcom
PRO
1
130
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
Kiro Crew入門 - 常駐エージェントの仕組みと使いどころ / Intro to Kiro Crew
k_adachi_01
1
150
TypeScript入門 2026
recruitengineers
PRO
3
600
ブラウザ研修 2026
recruitengineers
PRO
6
1k
システム思考で問題に対処する
yussak
0
300
強化学習「理論」入門
enakai00
3
3.6k
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
300
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9k
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
56k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.3k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
770
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
270
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
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