Как разрешить только номер в записи Xamarin.Forms? - PullRequest
0 голосов
/ 06 марта 2019

Я делаю специализированный денежный калькулятор с использованием записей xamarin.forms.Поскольку это калькулятор, я хочу разрешить только цифры, точки, запятые и, возможно, знак доллара, если это возможно.Я новичок в программировании в целом и пытался следовать примеру здесь поведения, которое частично выполняло бы работу.Этот код кажется более сложным, чем нужно для выполнения работы, которая кажется достаточно простой и даже не делает всего, что я хочу сделать.Я пробовал другие методы / способы, но они сделаны много лет назад и, похоже, больше не работают.Вот что у меня есть в C #

using System;
using Xamarin.Forms;

namespace CattleCalc
{
    class BehaviorsPage
    {
        public class NumbersOnlyBehavior : Behavior<Entry>
            {


            protected Action<Entry, string> AdditionalCheck;

            protected override void OnAttachedTo(Entry bindable)
            {
                base.OnAttachedTo(bindable);

                bindable.TextChanged += TextChanged_Handler;
            }

            protected override void OnDetachingFrom(Entry bindable)
            {
                base.OnDetachingFrom(bindable);
            }

            protected virtual void TextChanged_Handler(object sender, TextChangedEventArgs e)
            {
                if (string.IsNullOrEmpty(e.NewTextValue))
                {
                    ((Entry)sender).Text = 0.ToString();
                    return;
                }

                double _;
                if (!double.TryParse(e.NewTextValue, out _))
                    ((Entry)sender).Text = e.OldTextValue;
                else
                    AdditionalCheck?.Invoke(((Entry)sender), e.OldTextValue);
            }
        }
    }
}

И один пример записи из MainPage.Xaml ...

        <customentry:MyEntry x:Name="PurchasePriceEntry" Text="{Binding Source={x:Reference PurchasePriceStepper}, Path=Value}" Placeholder="1.60" 
                             TextColor="DarkSlateGray" FontAttributes="Bold" BackgroundColor="Ivory" TranslationX="3"
                             Grid.Column="1" Grid.Row="0" HorizontalTextAlignment="Center" Keyboard="Numeric" ReturnType="Next" VerticalOptions="End" MaxLength="5"
                             TextChanged="PurchasePriceEntry_Completed">
            <Entry.Behaviors>
                <local:NumbersOnlyBehavior />
            </Entry.Behaviors>            
        </customentry:MyEntry>

Когда я запускаю это, я получаю пару ошибок, в основном утверждаячто мое поведение не было найдено .... Я даже направляюсь в правильном направлении ??Или есть более простой способ сделать это?Я вовсе не против того, чтобы отбирать этот код и идти другим путем, если это будет проще / проще, чем использование поведения !!

1 Ответ

1 голос
/ 06 марта 2019

Да, вы движетесь в правильном направлении, нет простого способа сделать это, кроме пользовательского рендера или дополнительного поведения

Скорее всего, вам не хватает соответствующего xmlns Декларация пространства имен XAML

xmlns:behavior="clr-namespace:<yourNameSpave>;assembly=<YourAssembly"

Полный пример

<Page x:Class="WPFApplication1.MainPage"  
    ...
    xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary">  
  ...  
  <custom:ExampleClass/>  
...  
</Page>

Как примечание, я создал один, который я обычно использую, который имеет дело с отрицательнымцифры и пробелы, которые также могут быть полезны.

public class NumericValidationBehavior : Behavior<Entry>
{
   protected override void OnAttachedTo(Entry entry)
   {
      entry.TextChanged += OnEntryTextChanged;
      base.OnAttachedTo(entry);
   }

   protected override void OnDetachingFrom(Entry entry)
   {
      entry.TextChanged -= OnEntryTextChanged;
      base.OnDetachingFrom(entry);
   }

   private static void OnEntryTextChanged(object sender, TextChangedEventArgs args)
   {
      if (string.IsNullOrWhiteSpace(args.NewTextValue))
      {
         ((Entry)sender).Text = "0";
         return;
      }

      var isValid = args.NewTextValue.ToCharArray()
                        .All(char.IsDigit) || (args.NewTextValue.Length > 1 &&  args.NewTextValue.StartsWith("-") ); //Make sure all characters are numbers

      var current = args.NewTextValue;
      current = current.TrimStart('0');

      if (current.Length == 0)
      {
         current = "0";
      }

      ((Entry)sender).Text = isValid ? current : current.Remove(current.Length - 1);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...