Как слушать таймер галочки глобально? - PullRequest
0 голосов
/ 17 ноября 2018

Я хочу, чтобы в моем приложении 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 голосов
/ 17 ноября 2018

Вы не можете ссылаться на один и тот же таймер.Я создал статический класс:

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 Я добавил кнопку для создания и отображения нескольких окон1

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window win = new Window1();
            win.Show();
        }
Когда я раскручиваю это и нажимаю кнопку несколько раз, у меня есть 3 экземпляра window1, и их анимация синхронизируется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...