2017-08-18 38 views
1

我正在創建一個具有條目的應用程序。我試圖限制條目只允許數字輸入。我已經嘗試過使用Keyboard =「Numeric」。然而,對於iPad而言,鍵盤的字符數不僅僅是數字。所以我不得不限制輸入的內容。然而,當我這樣做時,如果用戶鍵入括號,例如,它確實會停止輸入字符。但是如果用戶按下撤消,則會崩潰。我認爲這是因爲軟件鍵盤與應用程序分離,所以它正在尋找該括號字符,但它不在那裏。這裏是我的代碼:如何在xamarin中禁用/取消撤消按鈕

private void Entry_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     Entry theEntry = (Entry)sender; 
     string entryText = theEntry.Text; 
     if(entryText != null && entryText.Length != 0) 
     { 
      char theMostRecentInput = entryText[entryText.Length - 1]; 
      if(!Extension.IsNumeric(theMostRecentInput)) 
      { 
       theEntry.TextChanged -= Entry_TextChanged; 
       theEntry.Text = e.OldTextValue; 
       theEntry.TextChanged += Entry_TextChanged; 
      } 
     } 
    } 

感謝您的幫助!

+0

不知道如何解決這個問題,但你有另一個錯誤。你假設最近輸入的字符是字符串中的最後一個字符。更好的方法可能是在用戶完成表單時驗證數字,並通知用戶該字符串是否包含無效字符。在用戶輸入的文本框中設置字符串將導致意外的結果。 – Slepz

回答

0

我會在Entry自定義渲染這樣你就可以通過ShouldChangeCharacters控制輸入,而不必通過允許輸入,然後不得不刪除的處理程序和更改文本回到舊值雜牌它做到這一點。 ..

下面是一個允許數字的快速示例,它也自動處理粘貼非數字字符串的剪貼板,因爲這些字符串將被禁止。我正在使用NSCharacterSet.DecimalDigits字符集,因爲這會被操作系統國際化,但是您可以允許/禁止任何您選擇的字符。

你也可以包括觸覺,視覺或聽覺反饋上不允許使用/拒絕的條目...

[assembly: ExportRenderer(typeof(NumericEntry), typeof(NumericEntryRenderer))] 
namespace Forms_PCL_Tester.iOS 
{ 
    public class NumericEntryRenderer : EntryRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Entry> e) 
     { 
      base.OnElementChanged(e); 
      if (e.NewElement != e.OldElement) 
       if (Control != null) 
       { 
        Control.KeyboardType = UIKeyboardType.NumbersAndPunctuation; 
        Control.ShouldChangeCharacters += (UITextField textField, NSRange range, string replacementString) => 
        { 
         foreach (var aChar in replacementString) 
          if (!NSCharacterSet.DecimalDigits.Contains(aChar)) 
           return false; 
         return true; 
        }; 
       } 
     } 
    } 
}