高橋 忍のブログ

UX & モバイル、全ては心でエバンジェリズム♪

システムトレイは表示させないが時計は表示したい

システムトレイは表示させないが時計は表示したい

  • Comments 1

#wp7dev_jp #wpdev_jp

デフォルトでONになっているシステムトレイ。 アプリケーションの画面デザインを考えると表示させたくない、というときもあるでしょう。

でも、時計だけは表示させたい、なんて時もあるはず。では、自前で時計を作ってみましょう。

 

自前で時計表示

今回は、C#のコードだけ。これを全部コピペすれば OKです。(画面にLayoutRootがある前提です)

protected override void OnNavigatedTo(
    System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    #region 時計表示
    //システムトレイを非表示に設定
    //ただし画面デザインを考えるならXAMLを変更すべき
    //14行目: shell:SystemTray.IsVisible="false">
    //
    Microsoft.Phone.Shell.SystemTray.SetIsVisible(this, false);
    //オブジェクト作成して画面に配置
    //これもXAMLなら1行で終わる
    //<TextBlock x:Name="txtClock"
    //     HorizontalAlignment="Right" VerticalAlignment="Top"
    //     Text="" Margin="0,6,8,0" FontSize="18" Height="20" />
    //
    TextBlock txtClock = new TextBlock() { 
        HorizontalAlignment = HorizontalAlignment.Right, 
        VerticalAlignment = VerticalAlignment.Top, 
        Margin= new Thickness(0,6,8,0), 
        FontSize =18, Height = 20 };
    LayoutRoot.Children.Add(txtClock);
    //まずは現在の時刻を表示
    txtClock.Text = DateTime.Now.ToString("t");
    //タイマーの設定 ここでは 1分ごとに更新(TimeSpan(時間, 分, 秒);
    System.Windows.Threading.DispatcherTimer timer = 
        new System.Windows.Threading.DispatcherTimer();
    timer.Interval = new TimeSpan(0, 1, 0);
    timer.Tick += (s, ex) => 
    {
        txtClock.Text = DateTime.Now.ToString("t"); 
    };
    timer.Start();
    #endregion
}

ちょっと長い?でも前半はXAML側に書けば1か所訂正と1行追加で終わります。

実行結果はこんな感じです。1分ごとにタイマーで更新されますので、誤差は最大59秒。せめて30秒以内にしたいならタイマーを30秒毎に変更すればOK。

image

秒も表示したい、という場合は、"t" を "T" に変更して、 timer.Interval を new TimeSpan(0, 0, 1); にすれbOK。これなら初期設定も不要ですね。

image

ということでXAML併用した、1秒更新バージョンは、こんなに短くなります。

protected override void OnNavigatedTo(
    System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    #region 時計表示
    System.Windows.Threading.DispatcherTimer timer = 
        new System.Windows.Threading.DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    timer.Tick += (s, ex) =>{ 
        txtClock.Text = DateTime.Now.ToString("T");};
    timer.Start();
    #endregion
}
Comments
  • 動いているDispatcherTimerが(System.Threading.Timerのように)GCの対象になるなら更新が止まってしまいますし、

    そうでない(GCされない)ならばページを表示するたびにDispatcherTimerが動き出してユーザのバッテリを浪費してしまうように思えるのですが、

    (また、キャプチャしたtxtClockを経由して盛大にメモリリークする気がします)

    問題ないのでしょうか?

Page 1 of 1 (1 items)
Leave a Comment
  • Please add 1 and 1 and type the answer here:
  • Post