单击按钮停止 DispatcherTimer
Stopping DispatcherTimer with a button click
当我点击我的停止按钮时,我的计时器仍在倒计时,即使我告诉它停止。
我当前的相关代码:
我在这里命名计时器,因为我也需要访问它们以使用 stop/start 全部按钮。
namespace Row_Interface
{
public partial class MainWindow : Window
{
//Declare the timers here, so the stop all button can access them as well
DispatcherTimer motorTimer_1 = new DispatcherTimer();
TimeSpan motorCycleTime_1 = TimeSpan.FromSeconds(0);
当我点击打开按钮时,IndividualTestStart 方法被调用并传递相关参数:
public void motorOnBtn_1_Click(object sender, RoutedEventArgs e)
{
IndividualTestStart(motorOnBtn_1, motorOffBtn_1, motorTimer_1, motorCycleTime_1, timeUntilmotorCycle_1, motorTestCycles_1);
}
当我点击关闭按钮时,我想停止那个计时器,这样循环就永远不会结束:
private void motorOffBtn_1_Click(object sender, RoutedEventArgs e)
{
motorTimer_1.Stop();
motorOnBtn_1.IsEnabled = true; //Enables the start test button
motorOffBtn_1.IsEnabled = false; //Disables the stop test button
}
点击开始时调用。我最终会为停止按钮提供类似的东西,但我会一步一个脚印:
private void IndividualTestStart(Button startButton, Button stopButton, DispatcherTimer dispatcherTimer, TimeSpan timeSpan, TextBox timeRemaining, TextBox cycleCount)
{
stopButton.IsEnabled = true; //Enables the stop button
//Set the time to run. This will be set from the database eventually.
timeSpan = TimeSpan.FromSeconds(10);
//Set up the new timer. Updated every second.
dispatcherTimer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate
{
timeRemaining.Text = timeSpan.ToString("c"); //Sets the text in the textbox to the time remaining in the timer
startButton.IsEnabled = false; //Disables the start test button once the test is started
if (timeSpan == TimeSpan.Zero) //Checks to seee if the time has run out
{
dispatcherTimer.Stop(); //Stops the timer once the time has run out
startButton.IsEnabled = true; //Enables the start test button
int initialCycleCount = 0;
initialCycleCount++;
cycleCount.Text = initialCycleCount.ToString();
stopButton.IsEnabled = false;//Disables the stop button
}
timeSpan = timeSpan.Add(TimeSpan.FromSeconds(-1)); //Subtracts one second each time the timer "ticks"
}, Application.Current.Dispatcher); //runs within the UI thread
dispatcherTimer.Start(); //Starts the timer
}
}
当我单击停止按钮时,我希望文本框中的计时器停止倒计时。但是,它一直在滴答作响。当我点击停止时,开始按钮被重新启用,所以我知道它触发了事件处理程序中的代码。但它并没有停止计时器。
现在不开始新的计时器。
新代码:
public void motorOnBtn_1_Click(object sender, RoutedEventArgs e)
{
IndividualTestStart(motorOnBtn_1, motorOffBtn_1, motorTimer_1, motorCycleTime_1, timeUntilmotorCycle_1, motorTestCycles_1);
}
private void IndividualTestStart(Button startButton, Button stopButton, DispatcherTimer dispatcherTimer, TimeSpan timeSpan, TextBox timeRemaining, TextBox cycleCount)
{
stopButton.IsEnabled = true; //Enables the stop button
//Set the time to run. This will be set from the database eventually.
timeSpan = TimeSpan.FromSeconds(10);
{
timeRemaining.Text = timeSpan.ToString("c"); //Sets the text in the textbox to the time remaining in the timer
startButton.IsEnabled = false; //Disables the start test button once the test is started
if (timeSpan == TimeSpan.Zero) //Checks to seee if the time has run out
{
dispatcherTimer.Stop(); //Stops the timer once the time has run out
startButton.IsEnabled = true; //Enables the start test button
int initialCycleCount = 0;
initialCycleCount++;
cycleCount.Text = initialCycleCount.ToString();
stopButton.IsEnabled = false;//Disables the stop button
}
timeSpan = timeSpan.Add(TimeSpan.FromSeconds(-1)); //Subtracts one second each time the timer "ticks"
}; //runs within the UI thread
dispatcherTimer.Start(); //Starts the timer
}
您的代码中的问题是,您使用不执行任何操作的 DispatcherTimer
初始化 motorTimer_1
,然后将 motorTimer_1
作为 dispatcherTimer
参数传递,然后用新创建的不同 DispatcherTimer
替换参数的值。
新计时器工作正常,但是当您在 motorTimer_1
上调用停止时,没有任何反应,因为那不是 运行ning 的计时器。您可以简单地将新的 DispatcherTimer
直接分配给 IndividualTestStart()
中的 motorTimer_1
,但是您在参数化 IndividualTestStart()
中的所有内容时遇到了很大的麻烦,因此它可以与不同的 DispatcherTimer 一起工作。
相反,我们将执行以下操作:没有理由 传递 DispatcherTimer
。 IndividualTestStart()
必须创建 DispatcherTimer
才能对其进行初始化。好的,让我们 运行 开始吧。它将创建一个新的 return 它。
private DispatcherTimer IndividualTestStart(Button startButton, Button stopButton,
TimeSpan timeSpan, TextBox timeRemaining, TextBox cycleCount)
{
stopButton.IsEnabled = true; //Enables the stop button
//Set the time to run. This will be set from the database eventually.
timeSpan = TimeSpan.FromSeconds(10);
// Set up the new timer. Updated every second.
var dispatcherTimer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate
{
timeRemaining.Text = timeSpan.ToString("c"); //Sets the text in the textbox to the time remaining in the timer
startButton.IsEnabled = false; //Disables the start test button once the test is started
if (timeSpan == TimeSpan.Zero) //Checks to seee if the time has run out
{
dispatcherTimer.Stop(); //Stops the timer once the time has run out
startButton.IsEnabled = true; //Enables the start test button
int initialCycleCount = 0;
initialCycleCount++;
cycleCount.Text = initialCycleCount.ToString();
stopButton.IsEnabled = false;//Disables the stop button
}
timeSpan = timeSpan.Add(TimeSpan.FromSeconds(-1)); //Subtracts one second each time the timer "ticks"
}, Application.Current.Dispatcher); //runs within the UI thread
dispatcherTimer.Start(); //Starts the timer
return dispatcherTimer;
}
public void motorOnBtn_1_Click(object sender, RoutedEventArgs e)
{
if (motorTimer_1 == null)
{
// Create/initialize a new timer and assign it to motorTimer_1
motorTimer_1 = IndividualTestStart(motorOnBtn_1, motorOffBtn_1,
motorCycleTime_1, timeUntilmotorCycle_1, motorTestCycles_1);
}
else
{
// It's already there, just start it.
motorTimer_1.Start();
}
}
由于这是 WPF,您需要编写一个拥有 DispatcherTimer 的视图模型 class TimerThing
(想一个更好的名字),两个用于启动和停止它的命令,以及一个 public bool 属性 表示它是否是 运行ning。 IndividualTestStart() 应该是 class 的一个方法。父视图模型将有一个包含任意数量的 TimerThing
的 ObservableCollection<TimerThing>
,这将显示在 ItemsControl 中,该 ItemTemplate 创建绑定到 Start 和 Stop 命令的按钮。上面的代码看起来会很不一样,因为 C# 代码的 none 知道有关按钮的任何信息:相反,项目模板 XAML 中的按钮将通过绑定 enabled/disabled。
当我点击我的停止按钮时,我的计时器仍在倒计时,即使我告诉它停止。
我当前的相关代码:
我在这里命名计时器,因为我也需要访问它们以使用 stop/start 全部按钮。
namespace Row_Interface
{
public partial class MainWindow : Window
{
//Declare the timers here, so the stop all button can access them as well
DispatcherTimer motorTimer_1 = new DispatcherTimer();
TimeSpan motorCycleTime_1 = TimeSpan.FromSeconds(0);
当我点击打开按钮时,IndividualTestStart 方法被调用并传递相关参数:
public void motorOnBtn_1_Click(object sender, RoutedEventArgs e)
{
IndividualTestStart(motorOnBtn_1, motorOffBtn_1, motorTimer_1, motorCycleTime_1, timeUntilmotorCycle_1, motorTestCycles_1);
}
当我点击关闭按钮时,我想停止那个计时器,这样循环就永远不会结束:
private void motorOffBtn_1_Click(object sender, RoutedEventArgs e)
{
motorTimer_1.Stop();
motorOnBtn_1.IsEnabled = true; //Enables the start test button
motorOffBtn_1.IsEnabled = false; //Disables the stop test button
}
点击开始时调用。我最终会为停止按钮提供类似的东西,但我会一步一个脚印:
private void IndividualTestStart(Button startButton, Button stopButton, DispatcherTimer dispatcherTimer, TimeSpan timeSpan, TextBox timeRemaining, TextBox cycleCount)
{
stopButton.IsEnabled = true; //Enables the stop button
//Set the time to run. This will be set from the database eventually.
timeSpan = TimeSpan.FromSeconds(10);
//Set up the new timer. Updated every second.
dispatcherTimer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate
{
timeRemaining.Text = timeSpan.ToString("c"); //Sets the text in the textbox to the time remaining in the timer
startButton.IsEnabled = false; //Disables the start test button once the test is started
if (timeSpan == TimeSpan.Zero) //Checks to seee if the time has run out
{
dispatcherTimer.Stop(); //Stops the timer once the time has run out
startButton.IsEnabled = true; //Enables the start test button
int initialCycleCount = 0;
initialCycleCount++;
cycleCount.Text = initialCycleCount.ToString();
stopButton.IsEnabled = false;//Disables the stop button
}
timeSpan = timeSpan.Add(TimeSpan.FromSeconds(-1)); //Subtracts one second each time the timer "ticks"
}, Application.Current.Dispatcher); //runs within the UI thread
dispatcherTimer.Start(); //Starts the timer
}
}
当我单击停止按钮时,我希望文本框中的计时器停止倒计时。但是,它一直在滴答作响。当我点击停止时,开始按钮被重新启用,所以我知道它触发了事件处理程序中的代码。但它并没有停止计时器。
现在不开始新的计时器。 新代码:
public void motorOnBtn_1_Click(object sender, RoutedEventArgs e)
{
IndividualTestStart(motorOnBtn_1, motorOffBtn_1, motorTimer_1, motorCycleTime_1, timeUntilmotorCycle_1, motorTestCycles_1);
}
private void IndividualTestStart(Button startButton, Button stopButton, DispatcherTimer dispatcherTimer, TimeSpan timeSpan, TextBox timeRemaining, TextBox cycleCount)
{
stopButton.IsEnabled = true; //Enables the stop button
//Set the time to run. This will be set from the database eventually.
timeSpan = TimeSpan.FromSeconds(10);
{
timeRemaining.Text = timeSpan.ToString("c"); //Sets the text in the textbox to the time remaining in the timer
startButton.IsEnabled = false; //Disables the start test button once the test is started
if (timeSpan == TimeSpan.Zero) //Checks to seee if the time has run out
{
dispatcherTimer.Stop(); //Stops the timer once the time has run out
startButton.IsEnabled = true; //Enables the start test button
int initialCycleCount = 0;
initialCycleCount++;
cycleCount.Text = initialCycleCount.ToString();
stopButton.IsEnabled = false;//Disables the stop button
}
timeSpan = timeSpan.Add(TimeSpan.FromSeconds(-1)); //Subtracts one second each time the timer "ticks"
}; //runs within the UI thread
dispatcherTimer.Start(); //Starts the timer
}
您的代码中的问题是,您使用不执行任何操作的 DispatcherTimer
初始化 motorTimer_1
,然后将 motorTimer_1
作为 dispatcherTimer
参数传递,然后用新创建的不同 DispatcherTimer
替换参数的值。
新计时器工作正常,但是当您在 motorTimer_1
上调用停止时,没有任何反应,因为那不是 运行ning 的计时器。您可以简单地将新的 DispatcherTimer
直接分配给 IndividualTestStart()
中的 motorTimer_1
,但是您在参数化 IndividualTestStart()
中的所有内容时遇到了很大的麻烦,因此它可以与不同的 DispatcherTimer 一起工作。
相反,我们将执行以下操作:没有理由 传递 DispatcherTimer
。 IndividualTestStart()
必须创建 DispatcherTimer
才能对其进行初始化。好的,让我们 运行 开始吧。它将创建一个新的 return 它。
private DispatcherTimer IndividualTestStart(Button startButton, Button stopButton,
TimeSpan timeSpan, TextBox timeRemaining, TextBox cycleCount)
{
stopButton.IsEnabled = true; //Enables the stop button
//Set the time to run. This will be set from the database eventually.
timeSpan = TimeSpan.FromSeconds(10);
// Set up the new timer. Updated every second.
var dispatcherTimer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate
{
timeRemaining.Text = timeSpan.ToString("c"); //Sets the text in the textbox to the time remaining in the timer
startButton.IsEnabled = false; //Disables the start test button once the test is started
if (timeSpan == TimeSpan.Zero) //Checks to seee if the time has run out
{
dispatcherTimer.Stop(); //Stops the timer once the time has run out
startButton.IsEnabled = true; //Enables the start test button
int initialCycleCount = 0;
initialCycleCount++;
cycleCount.Text = initialCycleCount.ToString();
stopButton.IsEnabled = false;//Disables the stop button
}
timeSpan = timeSpan.Add(TimeSpan.FromSeconds(-1)); //Subtracts one second each time the timer "ticks"
}, Application.Current.Dispatcher); //runs within the UI thread
dispatcherTimer.Start(); //Starts the timer
return dispatcherTimer;
}
public void motorOnBtn_1_Click(object sender, RoutedEventArgs e)
{
if (motorTimer_1 == null)
{
// Create/initialize a new timer and assign it to motorTimer_1
motorTimer_1 = IndividualTestStart(motorOnBtn_1, motorOffBtn_1,
motorCycleTime_1, timeUntilmotorCycle_1, motorTestCycles_1);
}
else
{
// It's already there, just start it.
motorTimer_1.Start();
}
}
由于这是 WPF,您需要编写一个拥有 DispatcherTimer 的视图模型 class TimerThing
(想一个更好的名字),两个用于启动和停止它的命令,以及一个 public bool 属性 表示它是否是 运行ning。 IndividualTestStart() 应该是 class 的一个方法。父视图模型将有一个包含任意数量的 TimerThing
的 ObservableCollection<TimerThing>
,这将显示在 ItemsControl 中,该 ItemTemplate 创建绑定到 Start 和 Stop 命令的按钮。上面的代码看起来会很不一样,因为 C# 代码的 none 知道有关按钮的任何信息:相反,项目模板 XAML 中的按钮将通过绑定 enabled/disabled。