質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

2回答

4385閲覧

コード直書きのデザインでオブジェクトにアクセスする方法

randr

総合スコア202

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2016/09/09 14:36

編集2016/09/09 15:50
  • やりたいこと

Xamarin.Formsでデザインをコードに記述した場合に、
そのオブジェクトにアクセスする方法がわかりません。

C#

1Page GetTestPage() 2{ 3 return new ContentPage 4 { 5 Content = new StackLayout 6 { 7 Padding = 10, 8 Children = 9 { 10 new StackLayout 11 { 12 BackgroundColor = Color.Yellow, 13 Children = 14 { 15 new Entry 16 { 17 ClassId = "entText1", 18 Placeholder = "first message", 19 }, 20 new Label 21 { 22 ClassId="labMessage1", 23 BackgroundColor = Color.Navy, 24 }, 25 } 26 }, 27 new StackLayout 28 { 29 BackgroundColor = Color.Maroon, 30 Children = 31 { 32 new Entry 33 { 34 ClassId = "entText2", 35 Placeholder = "second message", 36 }, 37 new Label 38 { 39 ClassId="labMessage2", 40 BackgroundColor = Color.Navy, 41 }, 42 } 43 }, 44 new Button 45 { 46 Command = new Command(()=> 47 { 48 //entText1の内容をlabMessage1に表示 49 //entText2の内容をlabMessage2に表示 50 }) 51 }, 52 53 } 54 } 55 }; 56}

Childrenに追加する前にオブジェクトを生成してその変数を追加していれば、
ボタンクリックの中でアクセスすれば当然可能なのですが、
ふと気になったのでやってみたら、なかなかいいメソッドが見つかりませんでした。

  • やってみたこと

FindByNameというメソッドを見つけたので上記のようにClassIdプロパティを指定し使ってみましたが、使い方が悪いのかうまくいきませんでした。

C#

1Command = new Command(()=> 2{ 3 this.FindByName<Label>("labMessage1").Text = this.FindByName<Entry>("entText1").Text; 4})

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

頑張ればIdでViewを解決する事もできそうなので回答しておきます。

Element.FindByName は事前に Element.RegisterName メソッドで登録されたオブジェクトを探すメソッドですが、Element.RegisterNameのアクセス修飾子はinternalであるためアプリ開発者には使えません。
また ClassId プロパティもXamarin.Forms内部で使用するための物なので弄らない方が良いでしょう。

アプリ開発者が自由に使える識別子として、Xamarin.Form 2.0から追加された AutomationId プロパティがあります。

これは自動テストのために用意されているプロパティでXamarin.Formsの動作自体には影響しません。
(iOSでは id フィールド、Androidでは labelフィールドにマッピングされます)

どうしてもIdで解決したい場合、Elementツリーを探索してAutomationIdが一致するViewを探す "FindViewByAutomationId" のようなメソッドを独自に実装すれば実現できるかもしれません。

投稿2016/09/10 04:01

P3PPP

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

randr

2016/09/20 21:57

ClassIdは触らないほうがいいのは初耳でした。 ありがとうございます。
guest

0

ベストアンサー

これらによると、「不可能」です。

FindByNamex:Name を検索するものと思われますが、 x:Name をプログラムで指定することは不可能です。
また、2つ目のリンクでは、 「x:Name="mybutton"mybutton = new Button() は同じである。」 と言っています。

従って、素直に変数を追加するか、 XAML で UI を組み立てるしかないと思います。

投稿2016/09/09 18:01

amay077

総合スコア1075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

randr

2016/09/20 21:57

やはり変数で生成して、Layoutに追加する方法でやろうと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問