読者です 読者をやめる 読者になる 読者になる

IDE@Plex

C#,WPFやXamarinでのアプリ開発備忘録

〔C#〕〔Xamarin〕The $(TargetFrameworkVersion) for Xamarin.Forms.Platform.Android.dll (v7.0) is greater than the $(TargetFrameworkVersion) for your project (v6.0).

Xamarin C#

発生!謎警告!

Xamarinで勉強中に、タイトルにある警告がいきなり出てくるようになり、二進も三進も行かなくなった。

3つ出てきてる(以下参照)
f:id:peyangu485:20170322154026p:plain:h90

v7.0が必要だけど、おたくのプロジェクトのバージョンはv6.0でっせってことなんだろうけど、何勝手に出てきてんの……。
して、どこをいじれば上がったことになるんですかねぇ……。

対処

Droidプロジェクトのプロパティを開いて
f:id:peyangu485:20170322154750p:plain

Compile using Android versionとTarget Android versionを以下のように変更したら、今度はエラーが!!
f:id:peyangu485:20170322155036p:plain

f:id:peyangu485:20170322155122p:plain:h40

Android7.0(API 24)をインストールすればええんかな?
てことで、SDK Managerを開いてAndroid7.0(API 24)をインストール

で、起動!

警告の基本的な解決方法は、「SDK Managerで言われたバージョンをインストールしましょう。」です。

以下、俺の環境(もといソース)だけで発生した問題なので、スルーでOKです

コードは、

blog.okazuki.jp

を参考にしています。

Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = “System.Object”, name = “MainPage”.

Exception occurred while: Calling constructor TestApp3.Views.MainPage().

Exception is: ResolutionFailedException - Resolution of the dependency failed, type = “TestApp3.ViewModels.MainPageViewModel”, name = “(none)”.

Exception occurred while: while resolving.

Exception is: InvalidOperationException - The current type, TestApp3.Services.ISQLiteConnectionProvider, is an interface and cannot be constructed. Are you missing a type mapping?

At the time of the exception, the container was:
Resolving TestApp3.ViewModels.MainPageViewModel,(none)
Resolving parameter “todoItemService” of constructor TestApp3.ViewModels.MainPageViewModel(TestApp3.Services.ITodoItemService todoItemService)
Resolving TestApp3.Services.TodoItemService,(none) (mapped from TestApp3.Services.ITodoItemService, (none))
Resolving parameter “connectionProvider” of constructor TestApp3.Services.TodoItemService(TestApp3.Services.ISQLiteConnectionProvider connectionProvider)

Resolving TestApp3.Services.ISQLiteConnectionProvider,(none)

At the time of the exception, the container was:
Resolving TestApp3.Views.MainPage,MainPage (mapped from System.Object, MainPage)
Calling constructor TestApp3.Views.MainPage()

おら、さっぱりわからねーぞ!

ISQLiteConnectionProviderが上手くいってなさそうだけど、うーむ。

もう少し、調査してみるか……。
英語が読めれば苦労しないんだろうけど……。

何かわかれば追記します。

2017/3/23 追記
コメントでいただいた通り、ISQLiteConnectionProviderをコンテナにセットできていないのが原因でした。
AndroidInitializerクラスに記述はしていたんですが、それをどこからも呼び出していないという……。

結論はコメントにも書きましたが、MainActivityクラスのLoadApplicationメソッドの引数で渡している「new App()」の引数に「new AndroidInitializer()」を渡してあげれば無事に動きました。 ふたを開ければすごくしょーもないところだったっていうのが、もうね……。

てか、これ問題ごっちゃになってるじゃん……。
なので、上の方を少し書き換えました。

追記終わり

〔C#〕〔Xamarin〕ViewCellでListViewの表示をカスタマイズする(テーブル風)

C# 技術 Xamarin

今日は密かに開発、使用しているアプリの開発で詰まって解決したお話を。

◆目的

ListViewを用いて表形式にデータを表示する。
1行に複数のデータを表示するという意味。

続きを読む

〔C#〕わーい、すごーい

C# 技術 雑記

今流行りのけものフレンズに乗っかっていくスタイルな記事。

◆経緯

C#が好きなフレンズなので。

◆目的

目的など不要。
わーい! すっごーい!

続きを読む

〔C#〕〔ASP.NET〕showModalDialogの呼び出し時に親画面のスクロール位置が初期位置に戻ってしまうのを防ぐ

C# 技術

ASP.NETは難しいねってお話。

◆経緯

ASP.NETで開発をしていて、子画面を表示した時に親画面のスクロール位置がリセットされた。
MaintainScrollPositionOnPostbackをtrueにしているにも関わらず……。

子画面はJavaScriptのwindow.showModalDialogを使用して開いている。
ボタンクリックイベントからJavaScriptの設定をしている。

とまぁ、こんな状況だったんで解決方法を調べてみると意外と見つからなくて少々困った。(よくある話だと思ってた)
結局、微妙な英語力を頼りに見つけたのが以下の記事
forums.asp.net

なんとなーく、同じ悩みな気がする……。
これかなってことで、ごちょごちょしてみると期待通りの動きをしたので日本語版としてここに残しておこうと思う。

◆目的

JavaScriptで子画面を表示した時に親画面のスクロール位置を保持できるようにする。

◆実装

showModalDialogの呼び出し時に親画面のスクロール位置が初期位置に戻ってしまうのを防ぐ

細かい動きが追えていないので、はっきりとは言えないがどっかのタイミングでスクロール位置がリセットされるのを、「if (WebForm_RestoreScrollPosition) WebForm_RestoreScrollPosition();」この1文(2文?)で再度セットしているみたい。
個人的には原理不明のまま使うのは嫌なんだけど、検索力が低いためこれに関する情報が手に入らなかった……。(英語が読めていないだけの可能性……)

MaintainScrollPositionOnPostbackをtrueにしている時はhtmlソースに「window.onload = WebForm_RestoreScrollPosition;」が追加されるので、あながち変な実装でもないと思いたい。(願望

◆まとめ

こんな中途半端な状態で記事にするのはどうかと思ったけど、同じような悩みの人の足掛かりにでもなれれば幸い……。 詳しい方はぜひコメントをお願いいたします。

※2017/3/17 記事をリライト。

〔C#〕CSVのデータ内にカンマがあっても、カンマ区切りでデータを取得する

C# 技術

完全に個人用メモ。
どこかの誰かさんの役に立てばラッキー。
立たなくても俺の役に立つからおk。
そんな記事。

◆経緯

とあるテーブルの値をまるまる開発環境から本番環境に移動したかったんだけど、開発環境と本番環境でDBの場所が違う。
なので、データを手動で更新する必要が出たんだけど、テーブル削除して新しく作るのはなんか怖いしってことでデータを一旦CSVに吐き出して持っていくことになった。
ただ、このままだと1個1個手動で書き換えとか嫌なので、出力したCSVからUPDATE文を作ってやろうと考えたのが今回の始まり。

◆目的

  • CSVのデータ内にカンマがあっても、カンマ区切りでデータを取得することができるようになること。
  • TextFieldParserの存在を知ること。
続きを読む

〔C#〕 nameof演算子が使えないけど、似たようなことをする(プロパティ名の取得)

C# 技術

nameof演算子は便利だねってお話。

◆経緯

WPFアプリの実装中、

NotifyPropertyChangedに文字列の引数

と文字列でNotifyPropertyChangedに引数を渡している。
これ、プロパティ名を変更しても文字列は変更対象にならないので、ここの変更忘れが原因で動かなくなるってことが起きる。
まぁ、そこまで気づきにくい場所でもないけどちょっと鬱陶しい。

◆登場! nameof演算子

とか思っていると、C#6.0でnameof演算子が追加され、以下のように書くことができるように!!

nameof演算子

nameof(プロパティ名)
たったこれだけの記述にするだけで変更がかかるようになり、つまらないミスをなくすことができる。

これは素晴らしい。 いや、ほんと。

だけど、C#6.0の環境じゃないと使えない。
会社の環境によって使えるときと使えないときがある……。
「まぁ、その時は文字列でいいんじゃない?」って思ってしまうけど、あえてnameof演算子と似たようなことができるようにがんばる。

続きを読む

〔C#〕〔WPF〕アプリの2重起動を防ぐ

C# WPF 技術

今回は、WPFアプリで2重起動を防ぐ方法を忘れないために書いておく。

◆目的

WPFアプリで2重起動を防ぐ方法を学ぶ。

続きを読む