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で実践アプリ開発! 第二章 UI
Search
Ryosuke Uchiyama
February 26, 2021
Technology
190
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WPFで実践アプリ開発! 第二章 UI
Ryosuke Uchiyama
February 26, 2021
More Decks by Ryosuke Uchiyama
See All by Ryosuke Uchiyama
AWSでサーバレスな書籍管理アプリを作る
step63r
0
69
PythonでSlack通知botを作る
step63r
0
23
ChatGPT実践
step63r
1
400
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
50
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
35
深層強化学習で東方AI 第一章 DQNの基本
step63r
0
390
Build 2021 プレイバック
step63r
0
44
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
step63r
0
62
WPFで実践アプリ開発! 第三章 機能の実装 Part 1
step63r
0
140
Other Decks in Technology
See All in Technology
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
620
行動するAIのためのオントロジー | DevRev — Encraft #26.pdf
dvrv_tknrszk
1
620
OpenClawでAzure DevOpsのWiki更新を自動化する - クラウドAIだけでは届かない場所へ
yutakaosada
0
130
Harness Engineering on Rails
joelq
0
770
Account Factory for Terraformによる 標準化されたアカウント発行の自動化
pensuke628
0
120
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
160
手を動かして実感する、Kiro が変える開発体験
inariku
0
420
音声コミュニティを守るAI監視基盤_ 90%以上の入力削減を支えたServerless設計と運用判断
shuheioka123
0
120
1人アドミンな私はAWSアカウント申請をSlackで完結したい!
ysuzuki
0
100
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
3
21k
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
0
100
企業の現実世界をグラフで写し取る
sansantech
PRO
0
220
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
580
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Navigating Weather and Climate Data
rabernat
0
540
Building an army of robots
kneath
307
47k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Ruling the World: When Life Gets Gamed
codingconduct
0
380
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Scaling GitHub
holman
464
140k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
550
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Transcript
WPFで実践アプリ開発! 第二章 UI Ryosuke Uchiyama step63r
Windowsプログラミングの変遷 • Win32 API • C/C++向けのWindows GUI開発ライブラリ • 大規模なアプリケーション開発は大変で、難易度も高い •
Microsoft Foundation Class(MFC) • C++向けのWin32 APIラッパークラス群 • 依然として仕様が難解で、あんまり知名度が上がらなかった(らしい) • Microsoft .NET Framework • WindowsアプリやWebアプリの開発・実行環境 • 共通言語基盤(Common Language Interface: CLI)の、MS自身の実装(Common Language Runtime: CLR)を保証 • WinForms, WPF, UWP(WinRT)など多くのUIライブラリ、プログラミングモデルを確立 • .NET Core • クロスプラットフォームマネージソフトウェアフレームワーク(長い) C++ C++ VB C# VB C# 時代はネイティブからマネージへ 前 回 の あ ら す じ
これからどうなる?Windowsプログラミング 前 回 の あ ら す じ
データバインドに特化したUIフレームワーク XAMLデザイナー コードビハインド 前 回 の あ ら す じ
これから作っていくもの
ToDoWpf • やることリストを表示するアプリケーション • 「やること」を追加、削除、編集する機能 • 期日や優先度でソートする機能 • 期限切れを可視化する機能 •
通知領域に常駐する機能 • 詳細メモを登録する機能 • and so on...
ソースコード step63r/ToDoWpf https://github.com/step63r/ToDoWpf
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
イベント駆動型の欠点 • データの状態遷移が把握しづらい • データをUI(コントロール)へセットする行が多くなりがち • テストが自動化しにくい • コードビハインドで色々やりがち→バグの温床👻 •
UIスレッドで重い処理をやると死ぬ • UIスレッド以外からUI要素を弄ると死ぬ
UIスレッド以外からUI要素を弄ると死ぬ private void btnInputTask_Click(object sender, RoutedEventArgs e) { Task.Run(() =>
{ lbTasks.Items.Add(tbInputTask.Text); tbInputTask.Text = string.Empty; }); }
MVVM (Model-View-ViewModel)
UIとロジックを分離するためのソフトウェアアーキテクチャパターン • Model • アプリケーションのデータと手続き(ビジネス ロジック)を表現する • Modelの情報はViewModelを介してViewへ伝達 される •
Model自身はViewの描画を知らない(知る必要 がない) • View • UIへの入力とUIからの出力を担当する • ViewModelに含まれたデータをデータバイン ディング機構などによって自動的に描画する • Viewそのものに複雑なロジックは含まない • ViewModel • ViewとModelの間の情報伝達を担当する • ViewModelの変更は自動的にViewへ反映される
ViewModel基底クラスの実装 public abstract class ViewModelBase : INotifyPropertyChanged { public event
PropertyChangedEventHandler PropertyChanged; protected virtual void RaisePropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new ProperthChangedEventArgs(propertyName)); } }
コマンドの実装 public class RelayCommand : ICommand { private Action _action;
public RelayCommand(Action action) { _action = action; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return _action != null; } public void Execute(object parameter) { _action?.Invoke(); } }
そんなことをしなくても… Prism Library MVVM Light Toolkit Livet Catel
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
Appendix
参考文献 • Windows Presentation Foundation - Wikipedia • 連載:WPF入門 -
@IT • Model View ViewModel – Wikipedia