【问题标题】:UI not showing changes, Universal Windows [closed]UI 未显示更改,通用 Windows [关闭]
【发布时间】:2016-10-16 19:06:52
【问题描述】:

可以解释我的问题, 它的工作原理是这样的:

    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);
            }

        });
    }

扫描仪使用填充屏幕的网格,在此期间我无法更改不在该网格中的任何内容。网格在另一个线程中运行,当我调用主线程控件并给它们值时,它们接受值,但视觉上没有变化

【问题讨论】:

  • 请详细说明您的期望。从您给出的示例中很难看出
  • 扫描仪使用填充屏幕的网格,在此期间我无法更改不在该网格中的任何内容。网格在另一个线程中运行,当我调用主线程控件并给它们值时,它们接受值,但视觉上没有变化。

标签: c# user-interface async-await refresh uwp


【解决方案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. awaitscanner.Scan()调用,此时控件将返回给被调用(本例为btnScan_Click)
  4. 添加ConfigureAwait(true) 以返回与await 之前相同的SynchronizationContext

await 之后的所有内容只有在控件在await 之后返回时才会执行。

【讨论】:

  • 您的回答很好,遗憾的是对我来说这不是解决方案。我可以通过调试断点告诉“txtCodigoBarras.Text”得到我给他的值,由于某种原因它只是没有在 UI 上播种但是你提供的代码让它更快
  • @CFG 不行吗?
  • 问题依然存在,我编辑了上一个答案,而您正在回复更有用的内容
  • 我找到了解决问题的方法,但这不是解决方案。因为我在一个新线程上使用了一个新页面,所以它删除了我在主页中所做的所有更改,所以我将它存储在一个公共变量中,我用它来使信息在整个应用程序中传播,以返回我想要的变量。再次可见。这是非常糟糕的做法,所以如果有人找到一个实际的解决方案,那将是更可取的。感谢您的努力
【解决方案2】:

您可以使用 ThreadPool 线程来代替 UI 线程。例如(我理解的函数 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 中的代码现在可以在其他线程中运行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多