none
WPF でWindows.Forms.Timer に代わるもの RRS feed

  • 質問

  • WPF アプリで、デジタル時刻を表示させたいのです。

    WPF でWindows.Forms.Timer に代わるものがあればよいのですが、見当たりません。どうしたら、例えばLabel コントロールに刻一刻変わるデジタル時刻を表示させることができるのでしょうか?

    よろしくお願いいたします。

    2010年8月8日 15:57

回答

  • 詳しい仕様がわからないのですが、デジタル時計のようなものならSystem.Timers.Timerっていう手もあります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク yasheeki 2010年8月12日 2:05
    2010年8月8日 17:15
    モデレータ

すべての返信

  • System.Windows.Threading.DispatcherTimer をどうぞ。
    2010年8月8日 16:18
  • 詳しい仕様がわからないのですが、デジタル時計のようなものならSystem.Timers.Timerっていう手もあります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク yasheeki 2010年8月12日 2:05
    2010年8月8日 17:15
    モデレータ
  • ありがとうございます。

    やってみます。

    2010年8月12日 2:04
  • ありがとうございます。

    自分では、検索できませんでしたので、助かります。

    2010年8月12日 2:04
  • System.Timers.Timer が WPF アプリケーションで使用される場合は、System.Timers.Timer はユーザー インターフェイス (UI) スレッドとは別のスレッドで実行されることに注意します。
    http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatchertimer.aspx

    System.Windows.Threading.DispatcherTimer をお勧めします。


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年8月12日 16:02
  • デジタル時計のようなものですから、むしろUIスレッドとは別のスレッドで動いた方が良いように思ったのですが、知識の高いお二人ともSystem.Windows.Threading.DispatcherTimer を勧められていますので、私、何か勘違いしてますでしょうか??


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年8月12日 22:46
    モデレータ
  • デジタル時計ということはUIで更新するわけでタイミングはタイマーで作っても時刻はDateTimeで取得するでしょう。
    UIで更新するのであればWPFでは扱いにくい System.Timers.Timer より System.Windows.Threading.DispatcherTimer のほうが WPF 入門にはふさわしいんじゃないでしょうか?


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年8月13日 14:47
  • 確かにSystem.Timers.Timerを使った場合ですと、Dispatcher.Invokeを使ってActionデリゲートなどを使って操作しなければならなくなるので、WPF入門にはふさわしくないかもしれませんね。コードはそんなに複雑にはならないとは思うのですが、System.Timers.Timerを紹介しておいてフォローが足らなかったかもしれません。
    動作テストしてませんが、以下のような感じになると思います。

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
      Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>{
         //時計更新とかの処理
             ・
             ・
             ・
             ・
             ・
      }));
    }
    

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年8月14日 6:58
    モデレータ
  • Windows Forms において、System.Windows.Forms.Timer を使うか、それ以外の Timer を使うかのレベルに近いように思います。Windows Forms においてもさほど手間はかかりませんが、Invoke を書かないで済み、デメリットのないクラスを提案しますね。

    DispatcherTimer や System.Windows.Forms.Timer は UI が重いときに余分に処理しないというメリットも一応あります。
    System.Timers.Timer でやると UI の処理がタイマー間隔を超えた場合に、Invoke/Dispatch が貯まります。
    もちろん、そのような UI の処理を見直すべきですが、タイマーとしてどちらを使うべきかとしたら安全な方に倒しておくべきでしょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年8月14日 10:45