自定义条目上的已完成事件

时间:2018-05-23 13:27:17

标签: xamarin xamarin.forms

我有两个条目,一个用于用户名,另一个用于密码。

<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上获得Completed事件但不能。一旦用户点击键盘上的“下一步”按钮,焦点应转移到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 :(得分:2)

我可以看到你自己的类中包含了很多嵌套组件(在这种情况下为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等)的特定类执行此操作。

我希望它有所帮助。