C# WPF字段为空
我有私人场地C# WPF字段为空,c#,.net,wpf,C#,.net,Wpf,我有私人场地 private DateTime? StartTime; 我在点击按钮时设置该字段 private void btnStart_Click(object sender, RoutedEventArgs e) { StartTime = DateTime.Now; } 但当我从EventHandler访问该字段时 private void InitTimers() { Dispatch
private DateTime? StartTime;
我在点击按钮时设置该字段
private void btnStart_Click(object sender, RoutedEventArgs e)
{
StartTime = DateTime.Now;
}
但当我从EventHandler访问该字段时
private void InitTimers()
{
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
dispatcherTimer.Start();
}
private void DispatcherTimer_Tick(object sender, EventArgs e)
{
lbTime.Content = DateTime.Now.ToString("HH:mm:ss");
lbTodayDate.Content = DateTime.Now.ToString("MM/dd/yyyy");
if(StartTime != null) //Always null
lbElipsedTime.Content = DateTime.Now - StartTime;
CommandManager.InvalidateRequerySuggested();
}
StartTime
始终保持null
也许有人能解释一下
InitTimmers
在程序启动时在publicMainWindow()中调用默认构造函数
按钮点击开火,计时器滴答作响,我已经检查过了。
在按钮上单击StartTime
初始化为DateTime.Now
,因此它不等于null,但在计时器勾选上它等于null。仅为了测试,我在恐吓窗口中设置了StartTime
,使其变为非空,表达式if(StartTime!=null)
notfalse
更新
好吧,我做了一些愚蠢的事情,我正在运行异步方法,关键在于:
private void btnStart_Click(object sender, RoutedEventArgs e)
{
StartTime = DateTime.Now;
DoAsyncMethod(); //should do StartTime = null inside.
StartTime = null
}
我应该在异步方法中执行StartTime=null
,就是这样,谢谢大家。如果在dispatchermer\u Tick
和btnStart\u Click
处理程序中放置一个断点,您可能会发现dispatchermer\u Tick
处理程序首先被调用。。。因此,StartTime
属性尚未设置
如果您的意思是,即使连续单击按钮
,该值仍为null
,那么您可能在其他地方将其设置为null
,或者您的btnStart\u Click
处理程序未被调用。。。你确定它接线正确吗 如果在Dispatchermer\u Tick
和btnStart\u Click
处理程序中放置断点,您可能会发现首先调用Dispatchermer\u Tick
处理程序。。。因此,StartTime
属性尚未设置
如果您的意思是,即使连续单击按钮
,该值仍为null
,那么您可能在其他地方将其设置为null
,或者您的btnStart\u Click
处理程序未被调用。。。你确定它接线正确吗 我刚刚在一个测试应用程序中使用了这段代码,它运行正常。在此处添加代码以进行比较:
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private DateTime? StartTime;
public MainWindow()
{
InitTimers();
InitializeComponent();
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
StartTime = DateTime.Now;
}
private void InitTimers()
{
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
dispatcherTimer.Start();
}
private void DispatcherTimer_Tick(object sender, EventArgs e)
{
if (StartTime != null) //Always null
lbElipsedTime.Content = DateTime.Now - StartTime;
CommandManager.InvalidateRequerySuggested();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用System.Windows.Threading;
命名空间WpfApplication1
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
私人约会时间?开始时间;
公共主窗口()
{
初始化计时器();
初始化组件();
}
私有void btnStart\u单击(对象发送方,路由目标)
{
StartTime=DateTime.Now;
}
私有void InitTimers()
{
DispatcherTimer DispatcherTimer=新DispatcherTimer();
Dispatchermer.Tick+=Dispatchermer\u Tick;
Dispatchermer.Interval=新的时间跨度(0,0,1);
dispatchermer.Start();
}
私有void Dispatcher_Tick(对象发送方,事件参数e)
{
if(StartTime!=null)//始终为null
lbElipsedTime.Content=DateTime.Now-StartTime;
CommandManager.InvalidateRequestSuggested();
}
}
}
我刚刚在一个测试应用程序中使用了这段代码,它运行正常。在此处添加代码以进行比较:
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private DateTime? StartTime;
public MainWindow()
{
InitTimers();
InitializeComponent();
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
StartTime = DateTime.Now;
}
private void InitTimers()
{
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += DispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
dispatcherTimer.Start();
}
private void DispatcherTimer_Tick(object sender, EventArgs e)
{
if (StartTime != null) //Always null
lbElipsedTime.Content = DateTime.Now - StartTime;
CommandManager.InvalidateRequerySuggested();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
使用System.Windows.Threading;
命名空间WpfApplication1
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
私人约会时间?开始时间;
公共主窗口()
{
初始化计时器();
初始化组件();
}
私有void btnStart\u单击(对象发送方,路由目标)
{
StartTime=DateTime.Now;
}
私有void InitTimers()
{
DispatcherTimer DispatcherTimer=新DispatcherTimer();
Dispatchermer.Tick+=Dispatchermer\u Tick;
Dispatchermer.Interval=新的时间跨度(0,0,1);
dispatchermer.Start();
}
私有void Dispatcher_Tick(对象发送方,事件参数e)
{
if(StartTime!=null)//始终为null
lbElipsedTime.Content=DateTime.Now-StartTime;
CommandManager.InvalidateRequestSuggested();
}
}
}
您是否绝对确定您的按钮单击代码已执行?在按钮代码中设置断点以查看是否触发。您忘记单击该按钮了吗?呵呵呵呵如果(StartTime!=null)
怎么办?您是否尝试在此处设置断点以确保计时器已启动?:facepalm:这就是您需要向我们提供所有代码的原因。您是否绝对确定您的按钮单击代码已执行?在按钮代码中设置断点以查看它是否启动。您忘了单击该按钮?呵呵呵呵如果(StartTime!=null)怎么办?您是否尝试在此处设置断点以确保计时器已启动?:facepalm:这就是您需要向我们提供所有代码的原因。是的,您是正确的dispatchermer\u勾选首先触发。但是为什么在btnStart\u单击valueStartTime
后仍然保持null<