C#:如何在Windows核心IOT应用程序中的多个页面上显示时钟

时间:2017-05-16 14:25:07

标签: c# raspberry-pi win-universal-app windows-10-universal windowsiot

我是UWP的新手,我试图在多个页面上的Windows核心IOT应用上显示时钟。最好的方法是什么?

我尝试使用类的时间并动态更新它并将其与标头绑定,但是如何绑定来自"模板的标头"?我希望将时钟输入的标题位于我在应用程序的所有页面上使用的ResourceDictionary中。或者我应该将时钟放在App.xaml中,但即使在这种情况下,如何将其绑定到标题以便始终更新?

我是否需要在课堂上实施INotifyPropertyChanged,或者还有其他方法吗?

谢谢。

编辑: (05/17)

这是标题的代码

ResourceDictionnary:

<ResourceDictionary
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="using:Project.Resources"
 x:Class="Project.Header">
<!-- ... -->
   <!-- Header -->
   <DataTemplate x:Key="Header" x:DataType="local:Header">
      <TextBlock x:Name="labelHeader" Text="{x:Bind Time, Mode=OneWay}"/>
   </DataTemplate>
<!-- ... -->
</ResourceDictionary>

2 个答案:

答案 0 :(得分:0)

我将在这里讨论,并建议不要在应用程序的每个页面中添加相同的元素,而应使用两个框架。

前哨框架用于每页上的元素。这可以是你的标题,菜单,更新时间 - 你的名字。使处理该内容更容易。

使用它放置第二帧,并将其用于页面之间的导航。看看我们的应用程序 - 它有一个垂直的标题&#34;标记为&#39; Page 1&#39;,右侧有&#39; Page 2&#39; - 用于导航的那个。

Two frames

答案 1 :(得分:0)

您不需要将时钟放在每个页面上。您可以使用Frame控件将其他网页托管为MainPage的内容。把时钟放在MainPgae&#34;标题&#34;上。其他页面之间的导航发生在时钟区域之外。然后,您只能更新MainPage中的时钟并在其他页面之间共享。

以下是您可以参考的简单示例:

<强> MainPage.xaml中

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <TextBlock Text="{Binding Time}" Margin="20,5,5,5"/>
    <StackPanel>
        <Button Name="Page1" Content="Page1" Click="Page1_Click" />
        <Button Name="Page2" Content="Page2" Click="Page2_Click" />
        <Button Name="Page3" Content="Page3" Click="Page3_Click" />
    </StackPanel>
    <StackPanel VerticalAlignment="Center">
        <Frame Name="MyFrame"></Frame>
    </StackPanel>
</StackPanel>

<强> MainPage.xaml.cs中

    Clock clock = new Clock();
    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = clock;
        clock.InitClock();
    }

    private void Page1_Click(object sender, RoutedEventArgs e)
    {
        MyFrame.Navigate(typeof(Page1));
    }

    private void Page2_Click(object sender, RoutedEventArgs e)
    {
        MyFrame.Navigate(typeof(Page2));
    }

    private void Page3_Click(object sender, RoutedEventArgs e)
    {
        MyFrame.Navigate(typeof(Page3));
    }

<强> Clock.cs

public class Clock : INotifyPropertyChanged
{
    DispatcherTimer Timer = new DispatcherTimer();
    public string _time { get; set; }
    public string Time
    {
        get { return _time; }
        set
        {
            _time = value;
            OnPropertyChanged("Time");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler hander = PropertyChanged;
        if (hander != null)
        {
            hander(this, new PropertyChangedEventArgs(name));
        }

    }

    public void InitClock()
    {
        Timer.Tick += Timer_Tick;
        Timer.Interval = new TimeSpan(0, 0, 1);
        Timer.Start();
    }

    private void Timer_Tick(object sender, object e)
    {
        Time = DateTime.Now.ToString("h:mm:ss tt");
    }
}