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

Я работаю над приложением Xamarin.Forms для склада, мы используем Zebra TC25 , который имеет встроенный сканер штрих-кода. Сканер работает нормально и выдает коды.

У меня есть сетка, как показано ниже, и я хочу переместить фокус на следующее текстовое поле (Ввод) после сканирования. Теперь у меня есть метод обратного вызова, который запускается после сканирования.

Мой вопрос: Как мне изящно узнать, какой элемент находится в фокусе, а какой должен быть следующим?

Я пытался использовать TabIndex - он был проигнорирован.
Я попытался дать им имена, как показано ниже, а затем использовать словарь, который отображает каждый элемент Entry на следующий, который необходимо сфокусировать. Там мне пришлось перебирать ключи, а затем вызывать что-то вроде _focusOrder[entry].Focus();, что тоже не самое симпатичное решение. Особенно с учетом того, что будет несколько форм с более чем 3 кодами для сканирования.

Примечание : Сканер реализован в виде клавиатуры, и мне не нужно устанавливать значение со сканера в моем обратном вызове - он просто работает «из коробки». Поэтому я не слежу за сфокусированным элементом, так как он не нужен (для ввода).

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Text="Von" />
        <Entry Grid.Row="0" Grid.Column="1" Text="{Binding Path=VonLagerplatz}" x:Name="_vonEntry"   />
        <Label Grid.Row="1" Grid.Column="0" Text="Nach" />
        <Entry Grid.Row="1" Grid.Column="1" Text="{Binding Path=NachLagerplatz}" x:Name="_nachEntry" />
        <Label Grid.Row="2" Grid.Column="0" Text="Artikel" />
        <Entry Grid.Row="2" Grid.Column="1" Text="{Binding Path=Artikel}" x:Name="_artikelEntry" />
    </Grid>

Оптимальные решения: (которые я не смог заставить работать, потому что это мое первое приложение Xamarin)

заставить TabIndex -свойство работать.
Используйте прикрепленное свойство, где я могу ссылаться на следующий элемент в XAML. Так что есть что-то вроде <Entry .... x:Name="_vonEntry" NextElement="{Reference _nachEntry}" />

1 Ответ

0 голосов
/ 14 марта 2019

Одним из способов решения этой проблемы является написание пользовательского поведения, которое вы прикрепляете к своим записям.Примерно так:

<Entry x:Name="VonEntry" Grid.Row="0" Grid.Column="1">
    <Entry.Behaviors>
        <custom:NextElementOnReturn Element="{x:Reference NachEntry}" />
    </Entry.Behaviors>
</Entry>

<Entry x:Name="NachEntry" Grid.Row="1" Grid.Column="1" />

Вы должны будете реализовать поведение NextElementOnReturn самостоятельно.Насколько я знаю, нет ничего встроенного.

Есть хорошее руководство по поведению, которое поможет вам начать https://blog.xamarin.com/extend-xamarin-forms-controls-functionality-with-behaviors/

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