我有两个条目,一个用于用户名,另一个用于密码。
<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>
我怎样才能做到这一点?
答案 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
等)的特定类执行此操作。
我希望它有所帮助。