我想在我的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);
问题是此代码在我使用的每个自定义控件上都像一个新计时器,因此每个计时器事件都在每个自定义控件中触发,并作为不同步运行的新计时器运行。不能充当单个计时器。
答案 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();
}));
}
}
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Window win = new Window1();
win.Show();
}