在Xamarin.Forms MVVM(Prism)中的输入字段上设置焦点

在Xamarin.Forms MVVM(Prism)中的输入字段上设置焦点,xamarin.forms,prism,Xamarin.forms,Prism,我正在使用Xamarin.Forms和Prism创建我的移动应用程序 我有一个包含2个条目的屏幕。进入屏幕时,我想将焦点设置在第一个条目上。 然后,在用户在此条目中输入数据并进行验证之后,我想将焦点设置为第二个条目 根据第一个答案: 我应该做点错事。我创建了一个新的小Prism项目来测试它: MainPage.xaml MainPage.xaml.cs using Xamarin.Forms; namespace testEntry.Views { public partial c

我正在使用Xamarin.Forms和Prism创建我的移动应用程序

我有一个包含2个条目的屏幕。进入屏幕时,我想将焦点设置在第一个条目上。 然后,在用户在此条目中输入数据并进行验证之后,我想将焦点设置为第二个条目

根据第一个答案: 我应该做点错事。我创建了一个新的小Prism项目来测试它:

MainPage.xaml


MainPage.xaml.cs

using Xamarin.Forms;

namespace testEntry.Views
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            entry1.Focus(); //Not Working
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            entry1.Focus(); //Working
        }
    }
}
MyEntry.cs(主项目中)

MyEntryRenderer.cs(在Android项目中)


不幸的是,仍然没有关注我的字段:”(

有一种方法可以使用每个平台的可访问性API来实现这一点。Xamarin表单还没有可访问性的所有平台功能,因此您必须创建自定义呈现程序,然后在页面的生命周期事件中调用focus方法

因此,调用此Focus函数将导致应用程序关注该元素。您通常不想这样做,因为应用程序有意关注它的功能,以便用户能够获得一致的体验。但如果您真的想覆盖默认行为,在Android中是这样的

public static void Focus(View view)
        {
view.SendAccessibilityEvent(EventTypes.ViewFocused);
        }
在iOS中,您必须使用PostNotification API,这将是它的一些变体

UIAccessibility.PostNotification(UIAccessibilityPostNotification.ScreenChanged, entry element)

最后,您可以进一步了解可访问性焦点以获得确切答案,多亏了Saamer,我找到了使用EventAggregator的另一种方法

public类FocusChanged:PubSubEvent{}
然后在我的视图模型中:

IEventAggregator\u ea;
public Main PageViewModel(INavigationService navigationService,IEventAggregator事件聚合器):基本(navigationService)
{
_ea=事件聚合器;
}
在viewModel中,每当我要将焦点设置为字段时,我都会发送一个事件:

\u ea.GetEvent().Publish(“源”);
在我的观点背后的代码中,我处理这个事件:

IEventAggregator\u ea;
公共主页(IEventAggregator事件聚合器)
{
初始化组件();
_ea=事件聚合器;
_ea.GetEvent().Subscribe(SetFocusOnControl);//将处理此事件的方法的名称
}
///根据参数将焦点设置在条目上
///每个事件值将焦点设置在特定条目上(例如:源链接到条目txtScanSrc)
专用异步void SetFocusOnControl(字符串字段名)
{
输入l_视图;
交换机(字段名)
{
案例“source”:l_view=this.FindByName(“txtScanSrc”);break;
案例“数量”:l_视图=此.FindByName(“txtQty”);中断;
案例“tote”:l_view=this.FindByName(“txtScanTote”);break;
案例“托盘”:l_视图=此.FindByName(“txtScanPalout”);中断;
案例“destination”:l_view=this.FindByName(“txtScanDest”);break;
默认值:l_view=this.FindByName(“txtScanSrc”);break;
}
等待等待并执行(500,()=>{l_view.Focus();});
}

我曾经尝试编辑过我的上一篇文章。不幸的是,我没有工作。我应该做错事了!如果我在页面上添加一个按钮并调用entry1.focus(),它就工作了。我的问题似乎是在屏幕显示时将焦点放在这个字段上。(我还尝试覆盖OnAppearing())是的,你就快到了。尝试覆盖OnResume生命周期事件,因为我们想在页面加载后设置焦点。我的视图中没有任何可以覆盖的OnResume事件。我只能在App.xaml.cs中看到OnResume,但这不适用。对不起,我不知道该怎么办。糟糕,我很困惑,因为我主要工作现在使用xamarin native。有两种方法可以解决这个问题,一种是hacky方法,因此您可以在OnAppearing方法结束之前添加这个调用:wait WaitAndExecute(1000,()=>{//refresh code;}私有异步任务WaitAndExecute(int-miliec,Action-Action-toexecute){wait-Task.Delay(miliec);Action-toexecute();}最后一个解决方案是在屏幕出现时设置焦点。非常感谢。
public static void Focus(View view)
        {
view.SendAccessibilityEvent(EventTypes.ViewFocused);
        }
UIAccessibility.PostNotification(UIAccessibilityPostNotification.ScreenChanged, entry element)