2017-05-01 51 views
1

在Xamarin.Forms中,如何指定一个按钮作为页面的默认按钮?在Xamarin.Forms中指定一个默认按钮

例如,在UWP上,当用户在页面具有焦点时按下Enter键时,应触发DefaultButton的点击处理程序。

+2

由于用于指定默认按钮的平台无关的机制似乎并不存在OUT-在Xamarin.Forms框中,我提交了一个[建议](https://xamarin.uservoice.com/forums/144858-xamarin-platform-suggestions/suggestions/19109530-specify-a-default-button-in -xamarin-forms)。 –

+0

如果您使用的是输入控件,按下Enter键后会触发'Completed'事件处理程序。请注意,我一直在iOS和Android上使用它。不确定其他用途。 –

回答

-1

你不得不说“在Xamarin.Forms中,你如何指定一个按钮作为页面的默认按钮?”因为Xamarin.Forms仅可视化平台特定控件。

您应该问“在Android(或iOS)中,您如何指定一个按钮作为页面的默认按钮?”。

,我认为它是焦点按钮,这样你可以尝试像

Button b = new Button {Text = "This is the focused button"}; 
b.Focus(); 

但我不知道这一点。

采取这里in Xamarin forum

+0

此问题与自动更改焦点无关。例如,考虑Windows 10中的UWP更改PIN对话框。焦点规则都是标准的(点击控件获得焦点,标签前进焦点等)。从三个文本框中的任何一个文本框中,按Enter键会导致OK的单击处理程序被触发,因为它是默认按钮,但焦点保持不变。理想情况下,Xamarin.Forms将提供平台不可知的方式来指定默认按钮。由于它看起来不像,我想使用自定义渲染或其他可以提供相同效果的其他内容。 –

+0

@EdwardBrey,你问一个问题,回答你的问题,投票回答并评论答案。优秀 –

+0

如果我有问题的答案,我会将其作为答案发布。不幸的是,我没有。将焦点设置在按钮上并不是答案,因为默认按钮的重点在于它在*没有焦点时起作用。自定义渲染器可能是解决方案的一部分,但我无法实现它:'PageRenderer.Control'始终为空。 –

0

看看假设你要复制的行为,如以亚历山德罗第一则评论指出,要声明的Entry控制使用相同的事件处理程序的按钮Completed场。

例如,在XAML:

<Entry Placeholder="Enter PIN Here" 
     Completed="DefaultButton_Clicked"/> 

<Button Text="OK" 
     Clicked="DefaultButton_Clicked"/> 

然后在后面的代码:

void DefaultButton_Clicked(object sender, EventArgs e) 
{ 
    //Do stuff 
} 

如果您正在寻找做这一切在后面的代码就像你已经回答了,我建议这样做这样你就可以取消订阅你的活动。你会发现使用匿名函数更加痛苦。您应该在OnAppearing/OnDisappearing中订阅和取消订阅您的活动。

void DefaultButton_Clicked(object sender, EventArgs e) 
{ 
    if (model.MyCommand.CanExecute(null)) 
      model.MyCommand.Execute(null); 
} 

protected override void OnAppearing() 
{ 
    base.OnAppearing(); 
    foreach (var child in ((StackLayout)Content).Children) 
    { 
     if (child is Entry entry) 
      entry.Completed += DefaultButton_Clicked; 
    } 
} 

protected override void OnDisappearing() 
{ 
    base.OnDisappearing(); 
    foreach (var child in ((StackLayout)Content).Children) 
    { 
     if (child is Entry entry) 
      entry.Completed -= DefaultButton_Clicked; 
    } 
} 
+0

当默认按钮使用带有CanExecute过滤器的命令时,是否有类似的解决方法? –

+0

不直接我不认为。检查了这一点:http://stackoverflow.com/questions/4897775/wpf-binding-ui-events-to-commands-in-viewmodel –

0

我最终编写了连接每个条目的代码,以有条件地调用默认按钮的命令。在我的情况下,每个条目是在页面根单StackLayout,所以页面的构造函数有这样的代码:

foreach (var child in ((StackLayout)Content).Children) 
    if (child is Entry entry) 
     entry.Completed += delegate { 
      if (model.MyCommand.CanExecute(null)) 
       model.MyCommand.Execute(null); 
     }; 
+0

小心分配这样的代表。这会导致内存泄漏,如果你不''='他们。 –

+0

查看我最近的编辑 –

+0

@TimothyJames代表们不会在页面同时收集垃圾吗? –