GeoDiveExaのメイン機能である地図の移植は、CustomPinや背景地図、デジタルズーム機能が1番の問題です。CustomPinの次は背景地図移植を行いました。

1)背景地図の移植方針
前回行った「常識の独自のプロパティを作成して、PropertyChangedイベントを発生させて、CustomMapHandlerで横取り」する方法で、お作法を無視して背景地図=CustomTileOverlayを作成していきます。
2)背景地図の移植
CustomPinの修正 | 内容 |
---|---|
1)Xamarinで使用していたCustomTileOverlayをそのまま使用する | Xamarinで使用していた関数がほとんどそのまま使用できた |
2)Xamarinで使用していたOverlayRenderer作成をそのまま使用する | Xamarinで使用していた関数がほとんどそのまま使用できた |
3)SettingViewModelのTileSrc0UseとTileSrc1Useをプロパティーチェンジイベント対象とする | 背景設定で使用している変数をそのまま使用する。 |
4)TileSrc0UseとTileSrc1UseのsetにOnPropertyChangedを追加する。 | 変更を通知するOnPropertyChangedを追加する。 |
3)CustomMapHandlerでTileSrc0UseとTileSrc1Useのイベントを取得できるように、SettingViewModelのPropertyChangedイベントをCustomMapHandlerのOnMapViewModelPropertyChangedに対応づける。 例) // XYZ Tile用 | 常識のプロパティーチェンジイベントをとにかくCustomMapHandler内で処理できる様に設定します。 |
4)OnMapViewModelPropertyChangedでPropertyNameを比較して、TileSrc0UseやTileSrc1UseならXYZtileResetを実行する。 | XYZtileResetでは、設定に応じて、CustomTileOverlayを追加・削除を行います。 |
5)後は地図画面が移動・拡大・縮小のたびにCustomTileOverlayのOverlayRendererが実行される。 | OverlayRendererでは描画範囲のxyzに応じてタイルサーバから画像を取得する事を繰り返し、背景地図を描画していく。 |
3)感想
CustomPinの経験より背景地図はすんなりと移植できた。色々お作法を覚えるのは時間がかかるが、「勝手にProperty作って、自由に機能拡張する」方式なら最低限の知識のみで出来そうなんで、楽かもしれないですね。
copilotとgeminiに質問してみました。
回答にある「オブザーバーパターン」がCustomPinや背景地図の実装にあたります。
質問:c#のプロパティーとチェンジイベントは重要な機能と思いますがどうでしょうか
<copilotの回答>
その通りです!C#のプロパティと変更通知イベントは、非常に重要な機能です。これらは、特にデータバインディングやMVVMパターンを使用するアプリケーションで大きな役割を果たします。
プロパティ
プロパティは、クラスのフィールドにアクセスするための方法を提供し、データのカプセル化を容易にします。これにより、フィールドの値を設定する際に追加のロジックを実行することができます
変更通知イベント
INotifyPropertyChangedインターフェースは、プロパティの値が変更されたときに通知を行うための標準的な方法を提供します。これにより、UIとデータモデルの同期が容易になります
<geminiの回答>
C#のプロパティとチェンジイベントは、確かにC#の重要な機能であり、その重要性は多岐にわたります。
C#のプロパティとチェンジイベントが重要な理由
カプセル化の強化
データの保護: プロパティは、クラスの内部状態を直接変更されることを防ぎ、意図しないデータの破損を防ぎます。
データの一貫性の維持: プロパティのセッターで適切な検証を行うことで、常に有効な状態を保つことができます。
データバインディングの基盤
UIとデータの同期: WPFやWinFormsなどのGUIフレームワークでは、プロパティとチェンジイベントを利用して、UI要素とデータソース間の自動的な同期を実現します。
開発効率の向上: データバインディングにより、コード量が減り、開発効率が大幅に向上します。
オブザーバーパターンの実現
状態の変化の通知: チェンジイベントは、オブザーバーパターンを実装するための基盤となります。あるオブジェクトの状態が変化したときに、それに関連する他のオブジェクトに通知することができます。
疎結合なシステムの構築: オブザーバーパターンを利用することで、オブジェクト間の結合度を低く抑え、システムの保守性を高めることができます。
イベント駆動プログラミングのサポート
非同期処理: チェンジイベントは、非同期処理を実現するための重要な要素です。あるイベントが発生したときに、それに応じて処理を実行することができます。
ユーザーインタフェースの構築: ユーザーの操作に応じた処理を記述する際に、イベント駆動プログラミングは非常に有効です。
4)9月初めの移植地図画面
背景も表示できます(=左:Xamarin版、右:NetMAUI版)。

コメントを残す