Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ryosuke Uchiyama
June 04, 2021
Technology
63
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
71
PythonでSlack通知botを作る
step63r
0
24
ChatGPT実践
step63r
1
400
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
52
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
36
深層強化学習で東方AI 第一章 DQNの基本
step63r
0
410
Build 2021 プレイバック
step63r
0
44
WPFで実践アプリ開発! 第三章 機能の実装 Part 1
step63r
0
140
WPFで実践アプリ開発! 第二章 UI
step63r
0
190
Other Decks in Technology
See All in Technology
12 個 Tool と、 4,096 Token
hlum
0
110
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.1k
Google Cloud Next Tokyo 26登壇時のスクリプト
recruitengineers
PRO
0
210
IoTデバイスを繋げるプロトコルMatterをAndroidで使用する方法
harutiro
0
120
Essential architectural thinking (revised edition)
ufried
0
110
AIは爆速なのに、私が詰まっていた話 ― 音声入力と鳴くマスコットでボトルネックを削る
yama3133
0
560
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
160
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
160
ファミコンでPHPを動かす / PHP on the Famicom side b
tomzoh
0
140
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
510
SDDの運用にめげずに向き合った話
sansantech
PRO
1
140
ハードウェアコンペでもAI駆動開発が進んでいる話
iotengineer22
1
640
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Product Roadmaps are Hard
iamctodd
55
13k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
Designing Powerful Visuals for Engaging Learning
tmiket
1
600
sira's awesome portfolio website redesign presentation
elsirapls
0
450
Optimizing for Happiness
mojombo
378
71k
Claude Code のすすめ
schroneko
67
230k
A Soul's Torment
seathinner
8
3.7k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
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