监听计时器如何在全球范围内计时?

时间:2018-11-17 13:43:06

标签: c# wpf winforms

我想在我的wpf c#应用程序中有一个主计时器,该计时器的计数/运行独立于当前显示的页面。 我的软件在运行时创建了不同的自定义控件,在这些控件中,我需要能够监听主刻度线。

  namespace window6
  {
  public partial class Window6 : Window
  {.......

我已经尝试过:

  public static DispatcherTimer GlobalTimer = new DispatcherTimer();
  GlobalTimer.Interval = TimeSpan.FromMilliseconds(500);
  GlobalTimer.IsEnabled = true;

然后在任何自定义控件上触发一个计时器事件:

  window6.Window6.GlobalTimer.Tick +=  (global_Elapsed);

问题是此代码在我使用的每个自定义控件上都像一个新计时器,因此每个计时器事件都在每个自定义控件中触发,并作为不同步运行的新计时器运行。不能充当单个计时器。

1 个答案:

答案 0 :(得分:2)

无论如何,您不能引用相同的计时器。 我创建了一个静态类:

using System.Timers;

namespace wpf_GlobalTimer
{
    public static class TimerParent
    {
        public static Timer GlobalTimer { get; set; } = new Timer(3000)
        {
            AutoReset = true,
            Enabled = true
        };
    }
}

然后我添加了一个带有动画的简单窗口:

    <Window.Resources>
        <Storyboard x:Key="TestStoryboard">
            <DoubleAnimation 
                From="200"
                To="0" 
                Storyboard.TargetProperty="(Rectangle.Height)" 
                Storyboard.TargetName="Rect"
                FillBehavior="Stop" 
                Duration="0:0:2"
                />
        </Storyboard>
    </Window.Resources>
    <Grid>
        <Rectangle Name="Rect" Height="200" Fill="Green"/>
    </Grid>
</Window>

    public partial class Window1 : Window
    {
        private Timer timer = null;
        private Storyboard sb = null;
        public Window1()
        {
            InitializeComponent();
            timer = TimerParent.GlobalTimer;
            timer.Elapsed += OnTimedEvent;

            sb = this.Resources["TestStoryboard"] as Storyboard;
        }
        private  void OnTimedEvent(Object source, ElapsedEventArgs e)
        {
            Application.Current.Dispatcher.InvokeAsync(new Action(() =>
            {
                sb.Begin();
            }));
        }
    }
在Mainwindow中,我添加了一个按钮来实例化并显示多个window1

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window win = new Window1();
            win.Show();
        }
当我旋转并多次单击按钮时,我有3个window1实例,它们的动画是同步的。