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


#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 (1)

  1. Yotsuba より:

    動いているDispatcherTimerが(System.Threading.Timerのように)GCの対象になるなら更新が止まってしまいますし、

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

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

    問題ないのでしょうか?

Skip to main content