在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上使用它。不確定其他用途。 –