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
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
54
PythonでSlack通知botを作る
step63r
0
21
ChatGPT実践
step63r
1
370
IoT実践! 行先予定表を電子ペーパーで作る
step63r
0
27
React x Socket.ioで人狼サーバを作る 第一章 フロントエンド実装
step63r
0
22
深層強化学習で東方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をフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
140
組織における AI-DLC 実践
askul
0
140
Zenoh on Zephyr on LiteX
takasehideki
2
130
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
230
テスト設計の本質を改めて考えてみる~生成AIを活用する時代だからこそ、作ったテストの説明性を高めよう~
yamasaki696
1
120
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
7.7k
AIエージェントとPhysical AIが拓く製造業の変革(ハノーバーメッセリキャップ)
iotcomjpadmin
0
160
ぼっちではじめた登壇が「51名」「241件」の発信に化けた
subroh0508
1
330
製造現場での生成AIの活用、およびエージェントAIの実装のあり方、AVEVAの取り組み
iotcomjpadmin
0
180
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
3
860
Deep Data Security 機能解説
oracle4engineer
PRO
2
230
Featured
See All Featured
Making Projects Easy
brettharned
120
6.7k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
210
The agentic SEO stack - context over prompts
schlessera
0
830
Crafting Experiences
bethany
1
190
Odyssey Design
rkendrick25
PRO
2
710
The SEO Collaboration Effect
kristinabergwall1
1
490
Designing for Performance
lara
611
70k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Side Projects
sachag
455
43k
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>