【问题标题】:C# : How to display a clock on multiple pages in Windows core IOT appC#:如何在 Windows 核心 IOT 应用程序的多个页面上显示时钟
【发布时间】:2017-05-16 14:25:07
【问题描述】:

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

当时我尝试使用一个类并动态更新它并将其与标头绑定,但是我将如何绑定来自“模板”的标头?我想放入时钟的标题位于我在应用程序的所有页面上使用的 ResourceDictionary 中。或者我应该把时钟放在App.xaml,但是即使在这种情况下,我怎样才能将它绑定到标题,以便它总是被更新?

我需要在我的课堂上实现INotifyPropertyChanged,还是有其他方法?

谢谢。

编辑: (05/17)

这是标题的代码

资源字典:

<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>

【问题讨论】:

  • 您可以使用计时器like this 更新时间。而关于header,最好在这里展示你的代码。
  • @Rita Han - MSFT 感谢您的评论。我更新一页的时钟没有问题,我想做的是将时钟的相同代码绑定到多个页面。如果我只将它绑定到一页,它就可以工作。我如何能够与多个页面“共享”相同的背后代码,或者我应该如何更新一般这样的东西(在多个页面之间共享,但动态变化的东西)。

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


【解决方案1】:

您无需在每一页都设置时钟。您可以使用Frame 控件来托管其他页面作为MainPage 的内容。将时钟放在 MainPgae“标题”上。其他页面之间的导航发生在时钟区域之外。那么你只能在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");
    }
}

【讨论】:

  • 感谢您的示例!
【解决方案2】:

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

前哨框架用于每个页面上存在的元素。这可以是你的标题、菜单、更新时间——你可以命名它。使处理该内容更容易。

使用它放置第二个框架,并将其用于页面之间的导航。看看我们的应用 - 它有一个垂直的“标题”标记为“第 1 页”,右侧有“第 2 页” - 用于导航。

【讨论】:

  • 谢谢,我知道这会简化很多事情,我会在完成我需要在应用程序中实现的所有其他事情后尝试这样做。同时如果有人给出答案这更接近我已经拥有的我会先尝试这些方法。
  • 谢谢我试过了,它更容易,因为这个例子,我要把@Rita Han - MSFT 的答案标记为解决方案。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多