Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WPFで実践アプリ開発! 第三章 機能の実装 Part 1

WPFで実践アプリ開発! 第三章 機能の実装 Part 1

Ryosuke Uchiyama

April 05, 2021
Tweet

More Decks by Ryosuke Uchiyama

Other Decks in Technology

Transcript

  1. UIとロジックを分離するためのソフトウェアアーキテクチャパターン • Model • アプリケーションのデータと手続き(ビジネス ロジック)を表現する • Modelの情報はViewModelを介してViewへ伝達 される •

    Model自身はViewの描画を知らない(知る必要 がない) • View • UIへの入力とUIからの出力を担当する • ViewModelに含まれたデータをデータバイン ディング機構などによって自動的に描画する • Viewそのものに複雑なロジックは含まない • ViewModel • ViewとModelの間の情報伝達を担当する • ViewModelの変更は自動的にViewへ反映される 前 回 の あ ら す じ
  2. UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef

    期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
  3. アプリケーション設定 // 設定値の保存 Properties.Settings.Default.SomeValue = "This is a setting value";

    Properties.Settings.Default.Save(); // 設定値の読み込み string someValue = Properties.Settings.Default.SomeValue;
  4. 設定ファイルをどこに保存するか 列挙体のメンバ パス 具体例 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列挙体から取ってくるのがよい(とされている)
  5. UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef

    期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
  6. UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef

    期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
  7. 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
  8. 簡単な一意識別子 "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
  9. 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回
  10. UIを実装する #84c500a MVVM化する #bda66d5 タスクの保存機能を実装する #eac821a タスクの削除機能を実装する #6ee9fba タスクをモデル化する #ef5baef

    期限や優先度を可視化する #6c7e455 常駐機能を実装する #e9da2b9 ウィンドウ設定を保存する #e39d551 詳細メモを登録できるようにする #9e734f9 step63r/ToDoWpf コードビハインドで最低限のロジックを実装する #91176b6
  11. 自作クラスを比較可能にする public class ToDoTask : IComparable<ToDoTask> { // 中略 public

    int CompareTo(ToDoTask other) { // (1) 期限の古いタスクを優先する // (2) 期限が同じなら、優先度の高いタスクを優先する // (3) 優先度も同じなら、名前の若い方を優先する } } IComparable<T>インターフェイスを実装
  12. 期限超過かどうかを判定する 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>