Считать штрих-код, который содержит управляющие символы / невидимые символы (используя c # и wpf) - PullRequest
0 голосов
/ 15 ноября 2018

Требования: - Создание приложения для Windows для считывания штрих-кода, в котором есть управляющие символы / невидимые символы (с использованием c # и wpf)

Я приложил пример решения, которое я пробовал, но у меня возникла следующая проблема: -

Решение отлично работает для штрих-кода без управляющих символов, а также для штрих-кодов, имеющих ESC или Enter в качестве управляющих символов. Но для управляющих символов, таких как [TAB], [SHIFT], [DEL], [BACKSPACE], он работает неправильно.

Например: -

Если я вручную введу: 1234 [ALT] 009 [RELEASE ALT] 5678 [ENTER]: имитирует невидимый символ Но если я попытаюсь прочитать то же самое через штрих-код (см. Приложение для штрих-кода), все вещи будут очищены. (Проверьте в образце раствора) Когда я попытался выяснить причину с моей стороны, я обнаружил, что событие PreviewTextInput не вызывается для невидимого символа (элемент управления табуляции).

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

Пример решения и загруженный штрих-код

Заранее спасибо!

1 Ответ

0 голосов
/ 15 ноября 2018

Ваш TextBox не принимает вкладки, используйте

AcceptsTab="True"

, чтобы заставить его принять это вместо того, чтобы перейти к следующей вкладке.В WPF лучше использовать Binding вместо CodeBehind, поэтому я создал ViewModel для того, чтобы вы обрабатывали ввод.

Итак, в качестве первого шага я создал для вас ViewModel:

public class ViewModel: INotifyPropertyChanged
{
    private String _inputText;
    private ObservableCollection<String> _resultList = new ObservableCollection<string>();
    private String _resultText;

    public string InputText
    {
        get => _inputText;
        set
        {
            if (value == _inputText) return;
            _inputText = value;
            ProcessInput();
            OnPropertyChanged();
        }
    }

    private void ProcessInput()
    {
        ResultList.Clear();
        ResultText = GetUiFriendlyBarCode(InputText);
    }

    public ObservableCollection<string> ResultList
    {
        get => _resultList;
        set
        {
            if (Equals(value, _resultList)) return;
            _resultList = value;
            OnPropertyChanged();
        }
    }

    public string ResultText
    {
        get => _resultText;
        set
        {
            if (value == _resultText) return;
            _resultText = value;
            OnPropertyChanged();
        }
    }


    private string GetUiFriendlyBarCode(String input)
    {
        StringBuilder barCodeToDisplay = new StringBuilder();
        foreach (char character in input.ToString())
        {
            var uiFriendlyCharCode = GetUiFriendlyCharCode((int)character);
            barCodeToDisplay.Append(uiFriendlyCharCode);
            ResultList.Add(uiFriendlyCharCode);
        }
        return barCodeToDisplay.ToString();
    }

//... implement GetUiFriendlyCharCode and INotifyPropertyChnaged

Добавьте привязки в Xaml

    <Label Target="{Binding ElementName=Scan}">_Scan</Label>
    <TextBox AcceptsTab="True" Grid.Column="1" x:Name="Scan" Height="50" Text="{Binding InputText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

    <!-- List all characters separately -->
    <ListBox Grid.Row="2" Grid.ColumnSpan="2" x:Name="Log" ItemsSource="{Binding ResultList}"/>
    <!-- 
        Show a string to the user that clearly shows any invisible characters.
    -->
    <TextBlock Grid.Row="3">Result</TextBlock>
    <TextBox Grid.Row="3" Grid.Column="1" x:Name="Result" Text="{Binding ResultText}"/>

И затем добавьте источник данных в MainWindow

public MainWindow()
    {
        InitializeComponent();         
        DataContext = new ViewModel();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...