Как получить значение элемента gui в WPF? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь получить значение элемента от диспетчера.Однако я не могу понять, как передать это позже в коде.Я хочу передать прогресс в тестовую коробку о том, что было сделано.

Я получаю значение всякий раз, когда просто использую ProductId.Text в главном потоке.

Task.Run(() =>
            {
                ProductId.Dispatcher.Invoke(() =>
                {
                    string productId = ProductId.Text;});
                Console.WriteLine($"Creating game {productId}");
            });

Я просто хочу передать переменную productId позже в коде.Есть идеи?

1 Ответ

1 голос
/ 02 июля 2019

Судя по комментариям, существует длительный фоновый процесс, который должен публиковать обновления в пользовательском интерфейсе.

Это легко сделать с помощью класса Progress и * 1005.* IProgress интерфейс.Это описано в Включение выполнения и отмены в Async APIs . Progress может вызвать событие или вызвать обратный вызов Action<T> в потоке, в котором он был создан.Метод IProgress.Report позволяет другим потокам отправлять сообщения в Progress

При копировании из примера статьи этот метод обрабатывает изображения в фоновом потоке.Каждый раз, когда он хочет сообщить о прогрессе, он вызывает progress.Report(message);

async Task<int> UploadPicturesAsync(List<Image> imageList, IProgress<string> progress)
{
        int totalCount = imageList.Count;
        int processCount = await Task.Run<int>(() =>
        {
            foreach (var image in imageList)
            {
                //await the processing and uploading logic here
                int processed = await UploadAndProcessAsync(image);
                if (progress != null)
                {
                    var message=$"{(tempCount * 100 / totalCount)}";
                    progress.Report(message);
                }
                tempCount++;
            }

            return tempCount;
        });
        return processCount;
}

Все, что нужно, это создать новый экземпляр Progress в потоке пользовательского интерфейса перед запуском асинхронного метода:

void ReportProgress(string message)
{
    //Update the UI to reflect the progress value that is passed back.
    txtProgress.Text=message;
}

private async void Start_Button_Click(object sender, RoutedEventArgs e)
{
    //construct Progress<T>, passing ReportProgress as the Action<T> 
    var progressIndicator = new Progress<int>(ReportProgress);

    //load the image list *before* starting the background worker
    var folder=txtPath.Text;
    var imageList=LoadImages(folder);
   //call async method
    int uploads=await UploadPicturesAsync(imageList, progressIndicator);
}

Чтение из пользовательского интерфейса

Еще одна важная вещь заключается в том, что UploadPicturesAsync не не пытается прочитать свои входные данные из элемента пользовательского интерфейса, в зависимости от того, что это может быть.Он принимает входные данные, список изображений, в качестве параметра.Это облегчает работу в фоновом режиме, упрощает тестирование и значительно упрощает изменение.

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

...