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
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
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で実践アプリ開発! 第二章 UI
step63r
0
190
Other Decks in Technology
See All in Technology
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
130
OpenClawでAzure DevOpsのWiki更新を自動化する - クラウドAIだけでは届かない場所へ
yutakaosada
0
130
プラットフォームを「作る」、 チームに「入り込む」
sansantech
PRO
0
400
DORA_Metrics.pdf
wagnerfusca
1
140
Execution in the Kingdom of Agents: Reflections on Abstraction and Complexity
bcantrill
0
280
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
3
21k
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
340
SQL Server 2025 最適化されたロック
odashinsuke
0
100
ScotSecure West 2026 - Glasgow
raybugg
0
210
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
1
120
手を動かして実感する、Kiro が変える開発体験
inariku
0
420
AIに賢く動いてもらうためのコンテキスト〜Snowflake女子会 vol.8
snowwmn0824
0
200
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Building Applications with DynamoDB
mza
96
7.2k
Git: the NoSQL Database
bkeepers
PRO
432
67k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.3k
How to make the Groovebox
asonas
2
2.5k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
Ruling the World: When Life Gets Gamed
codingconduct
0
380
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
480
Odyssey Design
rkendrick25
PRO
2
850
Game over? The fight for quality and originality in the time of robots
wayneb77
1
290
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>