2016-02-28 73 views
0

我的UWP应用程序中有一个DispatcherTimer用于从Web服务更新数据库。DispatcherTimer在tick事件中不显示UI操作 - UWP

public DispatcherTimer SessionTimer { get; set; } 

在此定时器的tick事件中更新数据库之前,我折叠主网格并显示更新消息,并在更新完成后,我做相反的操作。

private void SessionTimer_Tick(object sender, object e) 
{ 
    rpWait.Visibility = Visibility.Visible; 
    LayoutRoot.Visibility = Visibility.Collapsed; 
    Update(); 
    rpWait.Visibility = Visibility.Collapsed; 
    LayoutRoot.Visibility = Visibility.Visible; 
} 

我的XAML代码:

<Grid x:Name="LayoutRoot" Style="{StaticResource backGrid}"> 
<RelativePanel Style="{StaticResource rpTop}"> 
... 
</RelativePanel> 
<Frame x:Name="frameBody" Loaded="frameBody_Loaded" Margin="0,100,0,0"/> 
</Grid> 

<RelativePanel x:Name="rpWait" Visibility="Collapsed"> 
    <StackPanel RelativePanel.AlignHorizontalCenterWithPanel="True" RelativePanel.AlignVerticalCenterWithPanel="True"> 
     <TextBlock x:Name="lbMessage" FontSize="30" HorizontalAlignment="Center">Updating</TextBlock> 
     <TextBlock x:Name="lbWaiting" FontSize="30" Margin="0 50 0 0">Please Wait</TextBlock> 
    </StackPanel> 
</RelativePanel> 

但计时器没有显示任何东西(DB正确更新)。

请帮帮我吗?

+0

我猜'LayoutRoot'是'rpWait'的* parent *? – kennyzx

+0

不,这是rpWait的兄弟姐妹。 –

+0

请显示XAML代码? – kennyzx

回答

0

我相信你的问题是你不运行更新()异步并等待更新。此外,如果你做UI更新更好的做他们在UI线程。

DispatcherTimer ds = new DispatcherTimer(); 

// In Constuctor of the page 

ds.Interval = new TimeSpan(0, 1, 0); 
ds.Tick += ds_Tick; 
ds.Start(); 

void ds_Tick(object sender, object e) 
     { 
      ShowHide(true); 
      await Update(); 
      ShowHide(false); 
     } 

private async void ShowHide(bool state) 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
    { 
     if(state) 
     { 
      rpWait.Visibility = Visibility.Visible; 
      LayoutRoot.Visibility = Visibility.Collapsed; 
     } 
     else 
     { 
      rpWait.Visibility = Visibility.Collapsed; 
      LayoutRoot.Visibility = Visibility.Visible; 
     } 
    }); 
} 

private Task Update() 
{ 
    //run your update 
    //if your update doesnt have await use 
    //return Task.Run(() => { 
    //   //doto 
    //  }); 
    //If it does just write your code 
} 
+0

感谢您的回答。它不工作。 –

+0

也许插入事件太快?尝试添加下面的任务.Sleep(5000)插入并检查Agian。 – Stamos

+0

否需要2分钟。 –