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 1
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ryosuke Uchiyama
April 05, 2021
Technology
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WPFで実践アプリ開発! 第三章 機能の実装 Part 1
Ryosuke Uchiyama
April 05, 2021
More Decks by Ryosuke Uchiyama
See All by Ryosuke Uchiyama
AWSでサーバレスな書籍管理アプリを作る
step63r
0
75
PythonでSlack通知botを作る
step63r
0
24
ChatGPT実践
step63r
1
410
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
54
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
36
深層強化学習で東方AI 第一章 DQNの基本
step63r
0
430
Build 2021 プレイバック
step63r
0
45
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
step63r
0
63
WPFで実践アプリ開発! 第二章 UI
step63r
0
190
Other Decks in Technology
See All in Technology
古い指輪から広がった JAVA コミュニティ とのつながり
yamad
0
140
AI駆動開発における開発環境のセキュリティの考え方
yamahiro
2
430
トークン化預金DCJPYの取り組みと活用ユースケース
finengine
0
230
Refining Active Record
shugo
0
190
Browser Spec: Testing Hotwire with Ruby
takahashim
1
160
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
5
1.2k
20年間 SNS サービス「GREE」 を支えた技術の刷新と、長期運用サービスの Kubernetes へのリアーキテクト
gree_tech
PRO
0
110
QAエンジニアがSoutherを使ってみたの〜10分でわかるSouther〜
mhlyc
0
110
macOS Golden Gate 時代のMac管理
tategami
0
130
Claude Code をローカルとサーバー上で利用した際の Bedrock 利用料をユーザー単位で一本化してみる
ohorig
0
110
AI コーディングと人間の認知スループット / CTO Night & Day 2026 Morning Session / AI Coding and Human Cognitive Throughput
prog893
5
1.5k
S3 Filesで挑む! 八戸せんべい汁の食べ頃問題
usanchuu
0
150
Featured
See All Featured
Building an army of robots
kneath
307
47k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
The agentic SEO stack - context over prompts
schlessera
0
970
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Odyssey Design
rkendrick25
PRO
2
880
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
310
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Transcript
WPFで実践アプリ開発! 第三章 機能の実装 Part 1 Ryosuke Uchiyama step63r
ToDoWpf • やることリストを表示するアプリケーション • 「やること」を追加、削除、編集する機能 • 期日や優先度でソートする機能 • 期限切れを可視化する機能 •
通知領域に常駐する機能 • 詳細メモを登録する機能 • and so on... 前 回 の あ ら す じ
UIとロジックを分離するためのソフトウェアアーキテクチャパターン • Model • アプリケーションのデータと手続き(ビジネス ロジック)を表現する • Modelの情報はViewModelを介してViewへ伝達 される •
Model自身はViewの描画を知らない(知る必要 がない) • View • UIへの入力とUIからの出力を担当する • ViewModelに含まれたデータをデータバイン ディング機構などによって自動的に描画する • Viewそのものに複雑なロジックは含まない • ViewModel • ViewとModelの間の情報伝達を担当する • ViewModelの変更は自動的にViewへ反映される 前 回 の あ ら す じ
ソースコード step63r/ToDoWpf https://github.com/step63r/ToDoWpf
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
アプリケーション設定 // 設定値の保存 Properties.Settings.Default.SomeValue = "This is a setting value";
Properties.Settings.Default.Save(); // 設定値の読み込み string someValue = Properties.Settings.Default.SomeValue;
複雑な型は Settings.Designer.cs へ [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public ObservableCollection<string> Tasks { get
{ return ((ObservableCollection<string>)(this["Tasks"])); } set { this["Tasks"] = value; } }
補足 データの保存形式と場所
アプリケーション設定の保存方法 INIファイル 初期のWindowsアプリで多用された。読みやすく編集もしやすい。 半構造化データのシリアライズには不向きでマシン間の共有も面倒。 レジストリ MFCで推奨された。ユーザーによって編集・削除されるリスクが少ない。読み書きが高速。 アンインストール時の削除漏れが多く、肥大化しやすい。誤用するとシステム全体に影響を及ぼすことがある。 XMLファイル .NETで推奨されている(ソース不明)。半構造化データの読み書きが比較的容易にできる。 人間には読みにくい。どこに配置するかでその後のメンテナンス性に良し悪しが出る。
Settings XML形式で半構造化データの読み書きに適している。配置場所も自動で決まる。 アプリケーションのバージョンごとに世代管理され、バージョンアップ時に設定値復元の考慮が必要。
設定ファイルをどこに保存するか 列挙体のメンバ パス 具体例 CommonApplicationData %PROGRAMDATA% C:¥ProgramData ApplicationData %APPDATA% C:¥Users¥(UserName)¥AppData¥Roaming
LocalApplicationData %LOCALAPPDATA% C:¥Users¥(UserName)¥AppData¥Local UserProfile %USERPROFILE% C:¥Users¥(UserName) MyDocuments C:¥Users¥(UserName)¥Documents CommonDocuments C:¥Users¥Public¥Documents なお、Settingsのパスは %LOCALAPPDATA%¥(CompanyName)¥(ProgramName_xxxx)¥(Version)¥user.config Environment.SpecialFolder列挙体から取ってくるのがよい(とされている)
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
Arrayと愉快な仲間たち
Listと愉快な仲間たち
Collectionと愉快な仲間たち
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
TextバインドとDisplayMemberPath TextBoxには [インスタンス名].[プロパティ名] でバインドする ListBoxには DisplayMemberPath プロパティでバインドする
UpdateSourceTriggerの必要性 UpdateSourceTriggerが取りうる値 値 意味 Default コントロールの既定を利用する Explicit UpdateSource() を明示的に呼び出したときだけ更新する LostFocus
コントロールがフォーカスを失うたびに更新する PropertyChanged プロパティが変更されるたびに即時更新する Binding.UpdateSourceTrigger プロパティ (System.Windows.Data) | Microsoft Docs https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.data.binding.updatesourcetrigger
補足 GUID (Globally Unique Identifier)
簡単な一意識別子 "GUID" 0c73b87d-15c3-4853-a779-15a52a79542b フォーマット 構造体定義 <guiddef.h> typedef struct _GUID {
unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[8]; } GUID; GUID - Win32 apps | Microsoft Docs https://docs.microsoft.com/en-us/windows/win32/api/guiddef/ns-guiddef-guid
GUIDはPowerShellでも生成できる
GUIDが重複する確率(期待値) typedef struct _GUID { unsigned long Data1; unsigned short
Data2; unsigned short Data3; unsigned char Data4[8]; } GUID; 32 bit 16 bit 16 bit 64 bit 128 bit 2 Τ 128 2 18,446,744,073,709,551,616 回に1回
UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef
期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
自作クラスを比較可能にする public class ToDoTask : IComparable<ToDoTask> { // 中略 public
int CompareTo(ToDoTask other) { // (1) 期限の古いタスクを優先する // (2) 期限が同じなら、優先度の高いタスクを優先する // (3) 優先度も同じなら、名前の若い方を優先する } } IComparable<T>インターフェイスを実装
ListBoxの見た目を改造する ItemContainerStyleを定義 <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Style.Triggers> <DataTrigger ...> <Setter
Property ... /> </DataTrigger> </Style.Triggers> </Style> </ListBox.ItemContainerStyle>
期限超過かどうかを判定する 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>