我正在将应用程序从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;
}
如果我想从后台例程中引用它,则该例程必须是静态的。如果进行此更改,则例程无法引用页面上的字段,因为它们不是静态的。
我知道这可能很明显,但是我很沮丧。
提前感谢。
您使用的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);
}
}