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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

Xamarin

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

Q&A

解決済

1回答

6210閲覧

Xamarin.Formsで画面オープン時に特定のコントロールにフォーカスを当てる方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

Xamarin

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

0グッド

0クリップ

投稿2019/05/26 03:04

環境

Xamarin.Forms 3.2.0.839982

前提・実現したいこと

Xamarin.Formsで画面オープン時にコードビハインドを
使用せず特定のコントロールにフォーカスを当てたい

試した方法

とりあえずビヘイビアでなんとかしてみようとしたのが以下ソースですが
エラーはでなかったのですが、フォーカスは設定されませんでした

XAML

1<?xml version="1.0" encoding="utf-8" ?> 2<ContentPage 3 x:Class="BlankApp1.Views.LoginPage" 4 xmlns="http://xamarin.com/schemas/2014/forms" 5 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 6 xmlns:b="clr-namespace:BlankApp1.Behavior" 7 xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 8 prism:ViewModelLocator.AutowireViewModel="True"> 9 <ContentPage.Behaviors> 10 <b:OpenForcusBehavior FocusControl="{Binding Source={x:Reference User}}" /> 11 </ContentPage.Behaviors> 12 13 <StackLayout Style="{StaticResource StackLayoutStyle}"> 14 <Entry x:Name="User" /> 15 </StackLayout> 16</ContentPage>

C#

1 public class OpenForcusBehavior : Behavior<ContentPage> 2 { 3 public object FocusControl { get; set; } 4 5 protected override void OnAttachedTo(ContentPage bindable) 6 { 7 bindable.Appearing += SetFocus; 8 } 9 10 private void SetFocus(object sender, EventArgs e) 11 { 12 var f = (Binding)FocusControl; 13 14 var s = f.Source as Entry; 15 16 s.Focus(); 17 } 18 }

ご教示よろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題は、Androidでは、Appearingが呼ばれるタイミングが早すぎるところにあります。
なので、Task.Delayで少々待ってやるというのが、手っ取り早い解決策です。

c#

1 private async void SetFocus(object sender, EventArgs e) 2 { 3 await Task.Delay(100); 4 5 var f = (Binding)FocusControl; 6 7 var s = f.Source as Entry; 8 9 s.Focus(); 10 }

ちょっと本格的に、画面が表示されるタイミングでフォーカスを当てる様なエフェクトを作ってみました。

Androidプロジェクト

C#

1[assembly: ResolutionGroupName("BlankApp1")] 2[assembly: ExportEffect(typeof(FocusEffect), nameof(FocusEffect))] 3namespace BlankApp1.Droid 4{ 5 public class FocusEffect : PlatformEffect 6 { 7 private Listener _listener; 8 9 protected override void OnAttached() 10 { 11 _listener = new Listener(this); 12 Control.ViewTreeObserver.AddOnPreDrawListener(_listener); 13 } 14 15 protected override void OnDetached() 16 { 17 if (_listener != null) 18 { 19 Control.ViewTreeObserver.RemoveOnPreDrawListener(_listener); 20 _listener = null; 21 } 22 } 23 24 private void Focus() 25 { 26 (Element as VisualElement)?.Focus(); 27 28 if (_listener != null) 29 { 30 Control.ViewTreeObserver.RemoveOnPreDrawListener(_listener); 31 _listener = null; 32 } 33 } 34 35 private class Listener : Java.Lang.Object, ViewTreeObserver.IOnPreDrawListener 36 { 37 private FocusEffect _effect; 38 39 public Listener(FocusEffect effect) 40 { 41 _effect = effect; 42 } 43 44 public bool OnPreDraw() 45 { 46 _effect.Focus(); 47 return true; 48 } 49 } 50 } 51}

共通プロジェクト

C#

1namespace BlankApp1.Effects 2{ 3 public class FocusEffect : RoutingEffect 4 { 5 public FocusEffect() : base($"BlankApp1.{nameof(FocusEffect)}") 6 { 7 } 8 } 9}

xml

1<?xml version="1.0" encoding="utf-8" ?> 2<ContentPage 3 x:Class="BlankApp1.Views.LoginPage" 4 xmlns="http://xamarin.com/schemas/2014/forms" 5 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 6 xmlns:b="clr-namespace:BlankApp1.Behavior" 7 xmlns:e="clr-namespace:BlankApp1.Effects" 8 xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 9 prism:ViewModelLocator.AutowireViewModel="True"> 10 11 <StackLayout Style="{StaticResource StackLayoutStyle}"> 12 <Entry x:Name="User" > 13 <Entry.Effects> 14 <e:FocusEffect /> 15 </Entry.Effects> 16 </Entry> 17 </StackLayout> 18</ContentPage>

投稿2019/05/26 04:51

編集2019/05/27 16:26
f-miyu

総合スコア1625

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

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

退会済みユーザー

退会済みユーザー

2019/05/26 21:31

言われた方法で動きました、ありがとうございます。 ※ちなみに私の環境だとDelay(1000)で正しく動きました。 ところで、ご回答に「手っ取り早い解決策です」とありますが 手っ取り早くない本格的な対応方法がある、ということでしょうか? もしあるとすれば、簡単でもよいのでその方法をご教示お願いできないでしょうか。
f-miyu

2019/05/27 16:29

本格バージョンを回答に追記しました。
退会済みユーザー

退会済みユーザー

2019/05/28 13:36

フォーカスあたりました。 Effect使ったことがないので、Effectの勉強がてら色々やってみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問