2017-05-01 52 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代表們不會在頁面同時收集垃圾嗎? –