ฉันจะหาตัวควบคุมที่เหมือนกับตัวควบคุมตัวจับเวลา C # ใน WPF ได้ที่ไหน
ฉันจะหาตัวควบคุมที่เหมือนกับตัวควบคุมตัวจับเวลา C # ใน WPF ได้ที่ไหน
คำตอบ:
ตัวจับเวลา WPF ปกติคือDispatcherTimer
ซึ่งไม่ใช่ตัวควบคุม แต่ใช้ในรหัส มันใช้งานได้เช่นเดียวกับตัวจับเวลา WinForms:
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
// code goes here
}
เพิ่มเติมเกี่ยวกับ DispatcherTimer สามารถพบได้ที่นี่
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
ด้วยโปรแกรมเลือกจ่ายงานคุณจะต้องรวม
using System.Windows.Threading;
โปรดทราบด้วยว่าหากคุณคลิกขวา DispatcherTimer และคลิกแก้ไขควรเพิ่มการอ้างอิงที่เหมาะสม
คุณยังสามารถใช้
using System.Timers;
using System.Threading;
จับเวลามีฟังก์ชั่นพิเศษ
หากคุณใช้StartAsync ()
หรือStart ()
เธรดจะไม่บล็อกองค์ประกอบส่วนต่อประสานผู้ใช้
namespace UITimer
{
using thread = System.Threading;
public class Timer
{
public event Action<thread::SynchronizationContext> TaskAsyncTick;
public event Action Tick;
public event Action AsyncTick;
public int Interval { get; set; } = 1;
private bool canceled = false;
private bool canceling = false;
public async void Start()
{
while(true)
{
if (!canceled)
{
if (!canceling)
{
await Task.Delay(Interval);
Tick.Invoke();
}
}
else
{
canceled = false;
break;
}
}
}
public void Resume()
{
canceling = false;
}
public void Cancel()
{
canceling = true;
}
public async void StartAsyncTask(thread::SynchronizationContext
context)
{
while (true)
{
if (!canceled)
{
if (!canceling)
{
await Task.Delay(Interval).ConfigureAwait(false);
TaskAsyncTick.Invoke(context);
}
}
else
{
canceled = false;
break;
}
}
}
public void StartAsync()
{
thread::ThreadPool.QueueUserWorkItem((x) =>
{
while (true)
{
if (!canceled)
{
if (!canceling)
{
thread::Thread.Sleep(Interval);
Application.Current.Dispatcher.Invoke(AsyncTick);
}
}
else
{
canceled = false;
break;
}
}
});
}
public void StartAsync(thread::SynchronizationContext context)
{
thread::ThreadPool.QueueUserWorkItem((x) =>
{
while(true)
{
if (!canceled)
{
if (!canceling)
{
thread::Thread.Sleep(Interval);
context.Post((xfail) => { AsyncTick.Invoke(); }, null);
}
}
else
{
canceled = false;
break;
}
}
});
}
public void Abort()
{
canceled = true;
}
}
}