在Xamarin.Forms中,如何指定一个按钮作为页面的默认按钮?在Xamarin.Forms中指定一个默认按钮
例如,在UWP上,当用户在页面具有焦点时按下Enter键时,应触发DefaultButton的点击处理程序。
在Xamarin.Forms中,如何指定一个按钮作为页面的默认按钮?在Xamarin.Forms中指定一个默认按钮
例如,在UWP上,当用户在页面具有焦点时按下Enter键时,应触发DefaultButton的点击处理程序。
你不得不说“在Xamarin.Forms中,你如何指定一个按钮作为页面的默认按钮?”因为Xamarin.Forms仅可视化平台特定控件。
您应该问“在Android(或iOS)中,您如何指定一个按钮作为页面的默认按钮?”。
,我认为它是焦点按钮,这样你可以尝试像
Button b = new Button {Text = "This is the focused button"};
b.Focus();
但我不知道这一点。
采取这里in Xamarin forum
此问题与自动更改焦点无关。例如,考虑Windows 10中的UWP更改PIN对话框。焦点规则都是标准的(点击控件获得焦点,标签前进焦点等)。从三个文本框中的任何一个文本框中,按Enter键会导致OK的单击处理程序被触发,因为它是默认按钮,但焦点保持不变。理想情况下,Xamarin.Forms将提供平台不可知的方式来指定默认按钮。由于它看起来不像,我想使用自定义渲染或其他可以提供相同效果的其他内容。 –
@EdwardBrey,你问一个问题,回答你的问题,投票回答并评论答案。优秀 –
如果我有问题的答案,我会将其作为答案发布。不幸的是,我没有。将焦点设置在按钮上并不是答案,因为默认按钮的重点在于它在*没有焦点时起作用。自定义渲染器可能是解决方案的一部分,但我无法实现它:'PageRenderer.Control'始终为空。 –
看看假设你要复制的行为,如以亚历山德罗第一则评论指出,要声明的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;
}
}
当默认按钮使用带有CanExecute过滤器的命令时,是否有类似的解决方法? –
不直接我不认为。检查了这一点:http://stackoverflow.com/questions/4897775/wpf-binding-ui-events-to-commands-in-viewmodel –
我最终编写了连接每个条目的代码,以有条件地调用默认按钮的命令。在我的情况下,每个条目是在页面根单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);
};
小心分配这样的代表。这会导致内存泄漏,如果你不''='他们。 –
查看我最近的编辑 –
@TimothyJames代表们不会在页面同时收集垃圾吗? –
由于用于指定默认按钮的平台无关的机制似乎并不存在OUT-在Xamarin.Forms框中,我提交了一个[建议](https://xamarin.uservoice.com/forums/144858-xamarin-platform-suggestions/suggestions/19109530-specify-a-default-button-in -xamarin-forms)。 –
如果您使用的是输入控件,按下Enter键后会触发'Completed'事件处理程序。请注意,我一直在iOS和Android上使用它。不确定其他用途。 –