原始问题:我想在每次在我的Xamarin.Forms ContentPage上显示/隐藏软键盘时调用一个函数。
一种选择是使用自定义渲染器,我可以访问键盘观察者。我还没试过呢;我以为我会先尝试用其他方法敲打我的脑袋。
方法1)将事件处理程序分配给我页面上所有条目的聚焦/未聚焦事件,触发键盘显示/隐藏,在页面的代码隐藏中如下所示:
EventHandler<FocusEventArgs> keyboard_handler = (object sender, FocusEventArgs e) =>
{
var binding_context = BindingContext as MyViewModel;
binding_context?.OnKeyboardShowing();
};
PasswordEntry.Focused += keyboard_handler; // doesn't trigger keyboard_handler
PasswordEntry.Unfocused += keyboard_handler; // doesn't trigger
UsernameEntry.Focused += keyboard_handler; // triggers
UsernameEntry.Unfocused += keyboard_handler; //doesn't trigger
问题1 :为什么有些触发器没有?
方法2)使用EventTriggers
和自定义TriggerAction<Entry>
类,如下所示:
XAML文件的一部分显示其中一个条目(如果必须知道的话,它位于网格中,位于网格中ScrollView的StackLayout中):
<Entry Grid.Row="0"
x:Name="UsernameEntry"
Margin="0,2"
HorizontalOptions="FillAndExpand"
Placeholder="User"
IsVisible="{Binding UsernameEnabled}"
Completed="Username_Completed"
IsEnabled="{Binding EnableControls}"
Text="{Binding Username, Mode=TwoWay}" >
<Entry.Triggers>
<EventTrigger Event="Focused">
<local:FocusedAction />
</EventTrigger>
</Entry.Triggers>
</Entry>
代码隐藏中定义的TriggerAction<Entry>
类:
public class FocusedAction : TriggerAction<Entry>
{
protected override void Invoke(Entry entry)
{
Debug.WriteLine("Reached"); // Except it never reaches here.
}
}
问题2:为什么Invoke
没有被触发?
我在XAML,代码隐藏或其他地方遗漏了什么?我已经检查了Xamarin文档,但是一如既往,我发现它们没有用处。