Почему событие «Несосредоточенное» вызывается при вводе записи? - PullRequest
0 голосов
/ 09 марта 2020

В моем приложении Xamarin Forms я хотел бы выполнить проверку элемента Entry, когда пользователь выделит его. Использование Completed событие работает только тогда, когда пользователь нажимает «ввод» на клавиатуре. Я пытался использовать Unfocused, но это событие срабатывает, когда пользователь печатает на элементе Entry, и я действительно не понимаю, почему.

Как я могу выполнить фрагмент кода, только если элемент Entry не сфокусирован?

У меня есть 10 ViewCell элементов, подобных этому:

<ViewCell >
                        <StackLayout Orientation="Horizontal" Padding="13, 5" >
                            <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand" Spacing="1">
                                <Label Text="Matricola" VerticalOptions="Center" HorizontalOptions="StartAndExpand" ></Label>
                                <Entry x:Name="matricola" Text="{Binding Paziente.MatricolaPaziente, Mode=TwoWay}" HorizontalOptions="FillAndExpand" Completed="Entry_Completed" Unfocused="Entry_Completed" ></Entry>
                                <Label Text="{Binding RegistrationValidator.MatricolaError, Mode=OneWay}" HorizontalOptions="FillAndExpand" TextColor="IndianRed"></Label>
                            </StackLayout>
                        </StackLayout>
                    </ViewCell>

Код позади:

private async void Entry_Completed(object sender, EventArgs e){
// Some code here
}

Кроме того, событие запускается с неожиданными случайными отправителями (другие Entry элементов, всегда с e.IsFocused == false)

Ответы [ 4 ]

1 голос
/ 09 марта 2020

Я пытался с примерами форм, как это

 <ContentPage.Content>
    <StackLayout Spacing="20" Padding="15">
        <Label Text="Text" FontSize="Medium" />
        <Entry Text="{Binding Item.Text}" d:Text="Item name" FontSize="Small" Unfocused="Entry_Unfocused" Completed="Entry_Completed" />
        <Label Text="Description" FontSize="Medium" />
        <Editor Text="{Binding Item.Description}" d:Text="Item description" FontSize="Small" Margin="0" />
    </StackLayout>
</ContentPage.Content>

И в коде позади:

 private void Entry_Unfocused(object sender, FocusEventArgs e)
    {
        var txt = ((Entry)sender).Text;

        DisplayAlert("Info", $"Value of text after entry lost focus : {txt} ", "OK");
    }

    private void Entry_Completed(object sender, EventArgs e)
    {
        var txt = ((Entry)sender).Text; 

        DisplayAlert("Info", $"Value when Enter Key is tapped : {txt} ", "OK");
    }

Все работает отлично! Когда вы снова заглядываете в ваш код, кажется, что вы находитесь в списке. Может быть, проблема может возникнуть оттуда.

0 голосов
/ 12 марта 2020

Кажется, что проблема фокусировки Entry внутри ListView возникает (во втором ряду ListView и далее) на Android (8.1 и 9.0) (Xamarin.Forms 4.5.0.356).

См. Также « Проблема фокуса ввода внутри ListView ».

В качестве обходного пути используйте CollectionView (без ViewCell в ItemTemplate).

Образец без проблемы фокуса ввода:

<CollectionView>
  <CollectionView.ItemsSource>
    <x:Array Type="{x:Type x:String}">
      <x:String>First</x:String>
      <x:String>Second</x:String>
    </x:Array>
  </CollectionView.ItemsSource>
  <CollectionView.ItemTemplate>
    <DataTemplate>
      <Entry Text="collectionview" Focused="Entry_Unfocused" Unfocused="Entry_Unfocused" />
    </DataTemplate>
  </CollectionView.ItemTemplate>
</CollectionView>

Образец с проблемой фокуса ввода в ListView на Android (8.1 и 9.0):

<ListView>
  <ListView.ItemsSource>
    <x:Array Type="{x:Type x:String}">
      <x:String>First</x:String>
      <x:String>Second</x:String>
    </x:Array>
  </ListView.ItemsSource>
  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
        <Entry Text="listview" Focused="Entry_Unfocused" Unfocused="Entry_Unfocused" />
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

Код для наблюдения за событиями фокуса:

void Entry_Unfocused(object sender, FocusEventArgs e)
{
    Debug.WriteLine($"Entry_Unfocused:{e.IsFocused}:");
}

void Entry_Focused(object sender, FocusEventArgs e)
{
    Debug.WriteLine($"Entry_Focused:{e.IsFocused}:");
}
0 голосов
/ 10 марта 2020

Несфокусированное событие возникает, когда запись теряет фокус. Я делаю простой код для проверки и подтверждения.

Xaml:

 <ListView ItemsSource="{Binding list}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Entry Text="{Binding Name}" Unfocused="Entry_Unfocused" />
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Код:

public partial class EntryPage : ContentPage
{
    public ObservableCollection<Person> list { get; set; }
    public EntryPage()
    {
        InitializeComponent();
        list = new ObservableCollection<Person>()
        {
            new Person (){ Name="A"},
            new Person (){ Name="B"}
        };

        this.BindingContext = this;
    }

    private void Entry_Unfocused(object sender, FocusEventArgs e)
    {

    }
}
public class Person
{
    public string Name { get; set; }
}

enter image description here

0 голосов
/ 09 марта 2020

Я полагаю, что событие «Несосредоточенное» запускается независимо от фокуса или расфокусировки, но FocusEventArgs на событии должен иметь логическое значение IsFocused, которое должно показывать, находится ли запись все еще в фокусе. Вы пытались это проверить? Похоже, что вы не сфокусированный обработчик событий просто использует обобщенные c EventArgs, когда он может использовать более конкретные c FocusEventArgs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...