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
在程序启动时在public
MainWindow()中调用默认构造函数

按钮点击开火,计时器滴答作响,我已经检查过了。 在按钮上单击
StartTime
初始化为
DateTime.Now
,因此它不等于null,但在计时器勾选上它等于null。仅为了测试,我在恐吓窗口中设置了
StartTime
,使其变为非空,表达式
if(StartTime!=null)
not
false

更新

好吧,我做了一些愚蠢的事情,我正在运行异步方法,关键在于:

 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单击
value
StartTime
后仍然保持
null<