UWP从后台更新当前窗口

问题描述 投票:0回答:1

我正在将应用程序从WinRT移植到UWP。 (我已经将其移植到iOS和Android)

我的应用有多个页面。我需要能够确定当前正在查看哪个页面,然后更新内容。 (由于各种原因,不能选择DataBinding。)

我有一个在后台运行的例程(不在UI线程上),从调度计时器中调用。

在WinRT中,我按以下方式处理它:

            // If current window is MainPage, then update the displayed fields 
        var _Frame = Window.Current.Content as Frame;
        Page _Page = _Frame.Content as Page;
        if (_Page is MainPage)
        {
            MainPage _XPage = _Frame.Content as MainPage;
            _XPage.SetFieldsTick(spoton);
        }

由于UWP对于Windows.Current.Content返回null,所以我在Navigation例程中设置了标记以跟踪当前视图。我想正确解决此问题。

下一步是如何实际更改字段。

我在XAML代码后面有一个例程来设置字段

        public void SetFieldsTick(bool spot)
    {
        UTC_Data.Text = Vars.DateStrZ;
    }

如果我想从后台例程中引用它,则该例程必须是静态的。如果进行此更改,则例程无法引用页面上的字段,因为它们不是静态的。

我知道这可能很明显,但是我很沮丧。

提前感谢。

xaml view uwp winrt-xaml updating
1个回答
0
投票

您使用的Timer将提供一种机制,用于以指定的时间间隔在线程池线程上执行方法。它在单独的线程上运行。因此,如果要处理应用程序的UI,则需要在UI的调度程序线程上运行。在这种情况下,可以使用Dispatcher.RunAsync方法在UI线程上回调。例如:

App.xaml.cs:

public void StartTimer() 
{ 
    DateTime startTime; 
    startTime = DateTime.UtcNow; 
    var dispatcherTimer = new System.Threading.Timer(DispatcherTimer_Tick, startTime, 0, 1000); 
}

private async void DispatcherTimer_Tick(object state)
{
    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        var _Frame = Window.Current.Content as Frame;
        Page _Page = _Frame.Content as Page;
        if (_Page is MainPage)
        {
            MainPage _XPage = _Frame.Content as MainPage;
            _XPage.SetFieldsTick(true);
        }
    });
}

此外,建议使用DispatcherTimer,该代码可用于在产生UI线程的同一线程上运行代码。在这种情况下,您无需在UI线程上回调。

public void StartTimer() 
{ 
    var dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += dispatcherTimer_Tick;
    dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
    dispatcherTimer.Start();
}

private void dispatcherTimer_Tick(object sender, object e)
{
    var _Frame = Window.Current.Content as Frame;
    Page _Page = _Frame.Content as Page;
    if (_Page is MainPage)
    {
        MainPage _XPage = _Frame.Content as MainPage;
        _XPage.SetFieldsTick(true);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.