来自控制处理程序的Windows手机silverlight UI更新

时间:2015-10-11 18:28:36

标签: c# windows user-interface silverlight windows-phone

让我们考虑以下只更新堆栈面板的方法:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        var t = new TextBlock();
        t.Text = "TEXT1";

        var t2 = new TextBlock();
        t2.Text = "TEXT2";

        dummyStack.Children.Add(t);

        // This can be any synchronous work 
        Thread.Sleep(5000);

        dummyStack.Children.Add(t2);
    }

当然,接口在约5秒后更新,这意味着该方法完成执行。我的问题是,有没有办法在第一个文本块首次修改堆栈面板时强制UI更新,然后在下一次UI更新等5秒后修改..?

3 个答案:

答案 0 :(得分:0)

为什么不执行任务。延迟而不是睡觉。这将允许ui在代码等待时更新

private async void Button_Click(object sender,RoutedEventArgs e)     {         var t = new TextBlock();         t.Text =" TEXT1&#34 ;;

    var t2 = new TextBlock();
    t2.Text = "TEXT2";

    dummyStack.Children.Add(t);

    await Task.Delay(5000);

    dummyStack.Children.Add(t2);
}

答案 1 :(得分:0)

您可以将代码分成两部分,立即(同步)运行第一部分,并在运行silverlight框架代码后设置第二部分运行(异步)并使用第一部分中的更改更新可见UI

private void Button_Click(object sender, RoutedEventArgs e)
{
    //synchronous section
    var t = new TextBlock();
    t.Text = "TEXT1";
    dummyStack.Children.Add(t);

    Dispatcher.BeginInvoke(
        //asynchronous section
        ()=>{
            var t2 = new TextBlock();
            t2.Text = "TEXT2";
            // ... heavy calculations
            dummyStack.Children.Add(t2);
        }
    );
}

答案 2 :(得分:0)

您可以使用Task.Delay,这会导致上下文切换到UI。这可能是你的解决方案。

true