2016-06-15 2 views
0

OK, чтобы объяснить мою проблему, как это работает:UI не показывает изменений, Universal для Windows

private void btnScan_Click(object sender, RoutedEventArgs e) 
    { 
     txtCodigoBarras.Text = "Something"; 
    } 

Однако, это не работает, как это:

private void btnScan_Click(object sender, RoutedEventArgs e) 
    { 
     txtCodigoBarras.Text = "Something"; 
     ScanDefault(); 
    } 

код сканирования по умолчанию:

private void ScanDefault() 
    { 

     scanner.UseCustomOverlay = false; 

     scanner.TopText = "Hold camera up to barcode"; 
     scanner.BottomText = "Camera"; 

     //Start scanning 
     scanner.Scan().ContinueWith(t => 
     { 
      if (t.Result != null) 
      { 
       HandleScanResult(t.Result); 
      } 

     }); 
    } 

Сканирование ner использует сетку, заполняющую экран, за это время я не могу изменить ничего, что не в этой сетке. Сетка работает в другом потоке, когда я настраиваю основные элементы управления потоком и даю им значения, они принимают значения, но визуально нет изменений.

+0

Пожалуйста, расскажите подробнее о том, чего вы ожидаете. Трудно сказать из примера, который вы дали –

+0

Сканер использует сетку, заполняющую экран, за это время я не могу изменить ничего, что не в этой сетке. Сетка работает в другом потоке, когда я настраиваю основные элементы управления потоком и даю им значения, они принимают значения, но визуально нет изменений. – CFG

ответ

1

Основная проблема заключается в том, что SynchronizationContext изменяется в обратном вызове ContinueWith. Чтобы этого избежать, используйте ConfigureAwait(true).

Я думаю, вы должны перейти к async методу следующим образом:

private async void ScanDefault() 
{ 
    scanner.UseCustomOverlay = false; 

    scanner.TopText = "Hold camera up to barcode"; 
    scanner.BottomText = "Camera"; 

    //Start scanning 
    var scanResult = await scanner.Scan().ConfigureAwait(true); 
    HandleScanResult(scanResult); 
} 
  1. заметь метод как async, что позволяет использовать await.
  2. Изменить тип возвращаемого из void в Task (если это не было void, вы можете вернуть Task<previousReturnType>.
  3. await вы scanner.Scan() вызов, на данный момент управление будет возвращено к вызываемому (btnScan_Click в данном случае)
  4. Добавить ConfigureAwait(true) вернуться в тот же SynchronizationContext, как и до await.

Все, что после того, как ваш await только будут выполнены после возврата управления после await.

+0

Ваш ответ был хорош, к сожалению, для меня это не решение. Я могу сказать, что «txtCodigoBarras.Text» получает значение, которое я ему даю, по какой-то причине он просто не сеет на UI Код, который вы предоставляете, однако ускорил его работу – CFG

+0

@CFG это не работает? –

+0

проблема все еще сохраняется, я отредактировал предыдущий ответ, пока вы отвечали на что-то более полезное – CFG

0

Вместо потоков ThreadPool вы можете использовать поток пользовательского интерфейса. Например (функция Scan() возвращает строку, как я понимаю):

private async void btnScan_Click(object sender, RoutedEventArgs e) 
{ 
txtCodigoBarras.Text = "Something"; 
var result = await Task.Run(() =>ScanDefault()).ConfigureAwait(false); 
// working here with variable result ... 
} 

private async Task<string> ScanDefault() 
{ 

scanner.UseCustomOverlay = false; 

scanner.TopText = "Hold camera up to barcode"; 
scanner.BottomText = "Camera"; 

//Start scanning 
return scanner.Scan(); 
} 

Но помните, что код в ScanDefault теперь работает в другом потоке!

Смежные вопросы