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

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

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

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

Xamarin

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

Q&A

解決済

2回答

5126閲覧

RelativeLayoutでBoxViewの中央にLabelを設置したい[Xamarin.Forms]

shiita

総合スコア16

C#

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

Xamarin

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

0グッド

0クリップ

投稿2016/10/29 05:52

編集2016/10/29 08:11

###発生している問題
BoxViewの上にLabelを設置するRelativeLayoutを作成したいのですが、RelativeLayoutのView設置の基準点が左上になっているため、大きさの変化するLabelを常にBoxViewの中央に設置することができません。

C#

1 public class TestPage : ContentPage 2 { 3 public TestPage() 4 { 5 var boxView = new BoxView { WidthRequest = 100, HeightRequest = 100, Color = Color.Aqua}; 6 var label = new Label { FontSize = 30, TextColor = Color.White }; 7 var slider = new Slider { Minimum = 0, Maximum = 100 }; 8 slider.ValueChanged += (sender, e) => { label.Text = ((int)slider.Value).ToString(); }; 9 10 var rl = new RelativeLayout(); 11 rl.Children.Add( 12 boxView, 13 Constraint.Constant(0), 14 Constraint.Constant(0)); 15 rl.Children.Add( 16 label, 17 Constraint.RelativeToView(boxView, (parent, sibling) => boxView.Width / 2 - label.Width / 2), 18 Constraint.RelativeToView(boxView, (parent, sibling) => boxView.Height / 2 - label.Height / 2)); 19 20 Content = new StackLayout { Children = { rl, slider } }; 21 } 22 }

LabelのWidthとHeightから位置を調整したのですが、画像のようにLabelの大きさが変化した際に反映されませんでした(水色の部分がBoxView、数値を表示しているのがLabel)。
Sliderで数値の桁数が変わった時

その後Labelの大きさが変化せずに内容だけ変化した場合は、中央に移動してくれました。
Sliderで同じ桁数のまま値が変わった時

###回答してほしいこと
RelativeLayoutに限らなくても良いので、大きさが変化しても常に中央に設置する方法を教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

BoxViewとLabelを個別にレイアウトするよりも、ContentViewで一纏めにして扱う方が簡単かと思います。

var boxView = new BoxView { Color = Color.Aqua, // 親Viewいっぱいのサイズ HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, }; var label = new Label { FontSize = 30, TextColor = Color.White, // 親Viewいっぱいのサイズ HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, // 文字列は中央揃え VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.Center, // 余白をとりたい場合はMarginを使う //Margin = new Thickness(5), }; var boxLabel = new ContentView { WidthRequest = 100, HeightRequest = 100, // GridでBoxViewとLabelを重ねる Content = new Grid { Children = { boxView, label, }, }, };

投稿2016/10/29 08:21

P3PPP

総合スコア359

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

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

shiita

2016/10/29 08:55

回答ありがとうございます。P3PPPさんのブログには何度も助けてもらってます。 Gridって要素を重ねることができるんですね。無事解決しました。
guest

0

HorizontalOptionsを設定してみてはいかがでしょうか?
横いっぱいにFillしてExpandする方法があるはず…

で、Labelに表示するテキストを中央にすれば、ご要望の動作をするのではないでしょうか。

(すみません、実機検証出来る状態にないので、もしかしたらダメかもしれません…間違っていたらごめんなさい。)

投稿2016/10/29 07:11

編集2016/10/29 07:18
tabamotch

総合スコア53

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

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

shiita

2016/10/29 08:09

質問の仕方が悪かったですね、ごめんなさい。 水色の部分がBoxViewで、数値だけを表示しているのがLabelです。 BoxViewに対するLabelの相対座標の求め方についてなので、LayoutOprionsは関係ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問