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 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
130
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
58
PythonでSlack通知botを作る
step63r
0
22
ChatGPT実践
step63r
1
380
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
31
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
25
深層強化学習で東方AI 第一章 DQNの基本
step63r
0
300
Build 2021 プレイバック
step63r
0
38
WPFで実践アプリ開発! 第四章 機能の実装 Part 2
step63r
0
53
WPFで実践アプリ開発! 第二章 UI
step63r
0
170
Other Decks in Technology
See All in Technology
AIが当たり前の組織で エンジニアはどう育つか
nishihira
1
950
JAWS_ICEBERG_BASECAMP
iqbocchi
2
110
Kaggleで成長するために意識したこと
prgckwb
2
440
生成 AI 時代にいま一度「問い合わせ」について考えてみる
kazzpapa3
1
130
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
110k
第67回コンピュータビジョン勉強会CVPR2026読会前編
tsukamotokenji
0
160
Alphaモジュール使っていいのかい!?いけないのかい!?どっちなんだいっ!?
watany
1
320
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
310
アップデートで何が変わった?デモで学んで使いこなすIBM Bob2.0
muehara
0
220
AI、CDK と協働する Full TypeScript アプリケーション開発 / Full TypeScript Application with AI and CDK
geekplus_tech
2
480
副作用のある Lambda でも Lambda Power Tuning は使えるのか / lambda-power-tuning-side-effects
koukihosaka
1
140
AICoEでAIネイティブ組織への進化
yukiogawa
0
210
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
108
250k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
750
ラッコキーワード サービス紹介資料
rakko
1
4M
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
410
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
The browser strikes back
jonoalderson
0
1.4k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
The Curse of the Amulet
leimatthew05
2
13k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
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>