Завершенное событие в пользовательской записи - PullRequest
0 голосов
/ 23 мая 2018

У меня есть две записи, одна для имени пользователя, а другая для пароля.

<customEntry:EmailEntry Placeholder="Your email address" x:Name="Email" Keyboard="Email" WidthRequest="50" Text="{Binding UserName}"/>

<customEntry:PwdEntry Placeholder="Your password" x:Name="Password" IsPassword="true" Text="{Binding Password}"/>       

Две записи (EmailEntry и PwdEntry) имеют тип ContentView, а не ContentPage.Я пытаюсь получить событие «Завершено» в EmailEntry, но не смог.Как только пользователь нажимает кнопку «Далее» на клавиатуре, фокус должен сместиться на PwdEntry.

Если бы это были обычные записи, я знаю, что могу использовать,

Email.Completed += (object sender, EventArgs e) => Password.Focus();

Поскольку две записи являются ContentViews, я не могу изменить фокус на следующую запись, как только пользователь нажмет "Далее ".

Это мой CustomEntry ...

<?xml version="1.0" encoding="UTF-8"?><ContentView xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Ecommerce.Mobile.Core.EmailEntry"
         xmlns:local="clr-namespace:Ecommerce.Mobile.Core.CustomViews"
         xmlns:fr="clr-namespace:Ecommerce.Mobile.Core.Controls">

<ContentView.Content>
    <fr:MyFrame CornerRadius="5" 
           OutlineColor="{StaticResource MocoWhite}" 
           BackgroundColor="Blue" 
           HasShadow="false" Padding="15,0">    

        <Grid ColumnSpacing="16">
                <Grid.RowDefinitions>
                    <RowDefinition Height="50"/>
                    <RowDefinition Height="1"/>
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <Grid Grid.Column="0" Padding="0,10,0,0" HeightRequest="30" WidthRequest="20">
                    <Image Source="icons_envelope_white1x.png" HorizontalOptions="Start" />
                </Grid>

                <Grid Grid.Column="1" HeightRequest="65" WidthRequest="20">
                    <Label x:Name="HiddenLabel" Font="ProximaNovaRegular" FontSize="12" IsVisible="False" Margin="0" FontAttributes="Bold"/>
                    <fr:MyKeyboardEntry x:Name="EntryField" FontSize="15" TextColor="White" Keyboard="Email" ReturnType="Next" Text="{Binding Text, Mode=TwoWay}" PlaceholderColor="White" Margin="0,12,0,0"/>
                </Grid>
         </Grid>
     </fr:MyFrame>  
</ContentView.Content>

Как мне этого добиться?

1 Ответ

0 голосов
/ 23 мая 2018

Как я мог видеть, у вас есть много вложенных компонентов, завернутых в ваш собственный класс (в данном случае ViewCell).

Могу поспорить, что в конечном итоге у вас будет базовый компонент, который обеспечивает событиявы хотите выставить в своем компоненте верхнего уровня.

Давайте возьмем, к примеру, событие Completed.Предположим, у вас есть структура ниже:

- EmailEntry _inherites from_
   └ MyKeyboardEntry _inherites from_
      └ ...
         └ Entry (provides the `Completed` event)   

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

public class MyKeyboardEntry : View
{
    ...
    // Expose the event
    public event EventHandler<TextChangedEventArgs> TextChanged;

    ...
    // Subscribe the original one with your own handler
    public MyKeyboardEntry()
    {
        ...
        // Its your wrapped Entry object
        entry.TextChanged += OnTextChanged;
        ...
    }

    ...
    // Implementing the @EvZ suggestion
    public void TakeFocus()
    {
        entry.Focus();
    }
    ...
    // Finally, throw up your event notification 
    protected virtual void OnTextChanged(object sender, TextChangedEventArgs args)
    {
        ... // Handle something if you need

        TextChanged?.Invoke(this, args); // invoking the event this class owns using the C# 6 syntax

        /*
        // Using the C# <6
        var hdlr = TextChanged;

        if(hdlr != null) 
            hdlr.Invoke(this, args);
        */
    }

    ...
}

Теперь вы можете обрабатыватьMyKeyboardEntry.TextChanged событие вне класса.

Вы должны сделать это для каждого конкретного класса, который включает в себя еще один более общий (EmailEntry и т. д.).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...