Макет Xamarin не может получить фокус - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь создать компонент составного вида в формах Xamarin с именем FormElement, который состоит из двух меток и записи:

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:custom="clr-namespace:Mynamespace;assembly=Mynamespace"
         x:Class="Mynamespace.Components.FormEntry">
    <StackLayout Orientation="Horizontal">
        <Label x:Name="formRequiredStar"
               IsVisible="{Binding IsRequired}"
               Text="*" TextColor="Red"
               FontSize="15"
               FontAttributes="Bold"
               Margin="-12,0,0,0"
               HorizontalOptions="Start" />
        <Label x:Name="formLabel"
               HorizontalOptions="Start"
               Text="{Binding LabelText}"
               TextColor="{Binding LabelTextColor}"
               FontSize="{Binding LabelTextFontSize}"
               FontAttributes="{Binding LabelTextFontStyle}" />
    </StackLayout>
    <Frame BorderColor="Black"
           CornerRadius="7"
           Padding="5,0"
           Margin="0,-3,0,0"
           HasShadow="false">
        <Entry x:Name="mainEntry"
               Keyboard="{Binding KeybdType}"
               Placeholder="{Binding EntryPlaceHolder}"
               TextColor="Black"
               FontSize="Default"
               HeightRequest="{Binding EntryHeight}" />
    </Frame>
</StackLayout>

Далее я хочу переключить фокус с записи на "следующий элемент, когда пользователь нажимает кнопку «Готово», поэтому я делаю:

    namespace Mynamespace.Components
    {
        public partial class FormEntry : StackLayout
        {
            public VisualElement NextFocus
            {
                get { return (VisualElement)GetValue(NextFocusProperty); }
                set { SetValue(NextFocusProperty, value); }
            }

            public static readonly BindableProperty NextFocusProperty =
                BindableProperty.Create(nameof(NextFocus),
                                        typeof(VisualElement),
                                        typeof(FormEntry),
                                        null,
                                     Xamarin.Forms.BindingMode.OneWay);

            public FormEntry()
            {
                InitializeComponent();
                BindingContext = this;

                mainEntry.Completed += (s, e) =>
                {
                    if (NextFocus != null)
                    {
                        NextFocus.Focus();
                    }
                };
            }
        }
    }

Далее, чтобы FormEntry был целью NextFocus, я попытался добавить

    this.Focused += (s,e) => { mainEntry.Focus(); };

в конструктор, но обработчик никогда не вызывается, и я также пытался переопределить

    public new void Focus() {
        mainEntry.Focus();
    }

, но этот метод никогда не вызывается.Классы макета происходят от VisualElement, поэтому они должны наследовать Focused.Есть ли что-то в объектах Layout, которые мне не хватает?Я мог бы понять, что объекты Layout обычно не являются целью фокуса, но обработчик событий предположительно находится там, поэтому я должен иметь возможность его использовать.

Вот пример того, как я использую FormEntry при входе в системуэкран:

    <!-- Email -->
    <controls:FormEntry x:Name="usernameEntry"
                        Margin="25,40,25,0"
                        IsRequired="true"
                        EntryHeight="40"
                        KeybdType="Email"
                        NextFocus="{x:Reference passwordEntry}"
                        LabelText="{il8n:Translate Emailorusername}"
                        EntryPlaceHolder="{il8n:Translate EnterUsername}">
    </controls:FormEntry>

    <!-- Password -->
    <controls:FormEntry x:Name="passwordEntry"
                        Margin="25,0,25,0"
                        IsRequired="true"
                        EntryHeight="40"
                        LabelText="{il8n:Translate Password}"
                        EntryPlaceHolder="{il8n:Translate EnterPassword}" />

1 Ответ

0 голосов
/ 06 марта 2019

Я думаю, что у вас есть элемент nextfocus, вы можете получить mainEntry из nextfocus, например так:

 public FormEntry ()
    {
        InitializeComponent ();
        BindingContext = this;

        mainEntry.Completed += (s, e) =>
        {
            if (NextFocus != null)
            {
                FormEntry formentry = (FormEntry)NextFocus;
                Entry entry = formentry.mainEntry;
                entry.Focus();
            }
        };
    }

Тогда вы можете найти, что вы получите фокус.

...