【问题标题】:How listen timer tick globally?如何在全球范围内收听计时器?
【发布时间】:2018-11-17 13:43:06
【问题描述】:

我想在我的 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);

问题是这段代码在我使用的每个自定义控件上都像一个新计时器,所以每个计时器事件都会在每个自定义控件内触发,作为一个不同步运行的新计时器运行。不充当单个计时器。

【问题讨论】:

    标签: c# wpf winforms


    【解决方案1】:

    您不能以某种方式引用同一个计时器。 我创建了一个静态类:

    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();
                }));
            }
        }
    在主窗口中,我添加了一个按钮来实例化并显示多个 window1

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

    【讨论】:

    • 非常感谢!!!!我喜欢像你这样的人花时间用一个非常清晰的例子来解释!!!谢谢谢谢谢谢!!
    • 请注意,我做这件事的时间有限,所以它有点快 n 脏。 Dispatchertimer 在 ui 线程上触发,你可以避免调用异步的东西。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2016-07-03
    • 2017-06-12
    • 2017-12-09
    相关资源
    最近更新 更多