システムトレイは表示させないが時計は表示したい
#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。
秒も表示したい、という場合は、"t" を "T" に変更して、 timer.Interval を new TimeSpan(0, 0, 1); にすれbOK。これなら初期設定も不要ですね。
ということで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
- Anonymous
July 01, 2012
動いているDispatcherTimerが(System.Threading.Timerのように)GCの対象になるなら更新が止まってしまいますし、 そうでない(GCされない)ならばページを表示するたびにDispatcherTimerが動き出してユーザのバッテリを浪費してしまうように思えるのですが、 (また、キャプチャしたtxtClockを経由して盛大にメモリリークする気がします) 問題ないのでしょうか?