2014-07-03 68 views
0

我已经创建了一个wpf应用程序。其中有一个复选框和两个按钮用于启动和停止计时器。单击开始按钮后System.Timers.Timer aTimer将开始运行并调用方法checkboxstatus()以获取复选框状态并将其显示给用户。即使复选框被选中,我也会将消息视为False。我用下面的代码WPF更新基于UI线程控制状态的非UI线程数据

public partial class MainWindow : Window 
{ 
    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    bool ischeckboxchecked = false; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     aTimer.Elapsed += new ElapsedEventHandler(senddata_Tick); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     aTimer.Interval = 3000; 
     aTimer.Start(); 
    } 
    public string checkboxstatus() 
    { 
     string data = string.Empty; 
     ischeckboxchecked = false; 
     Dispatcher.BeginInvoke((Action)(() => 
     { 
      if (checkBox1.IsChecked == true) 
      { 
       ischeckboxchecked = true; //value is updating on each timer tick 
      } 
     })); 
     data += ischeckboxchecked.ToString(); 
     return data; 
    } 
    private void senddata_Tick(Object sender, EventArgs args) 
    { 
     string postdata = string.Empty; 
     postdata = checkboxstatus(); //every time am getting data as false 
     MessageBox.Show(postdata); 
    } 
    private void button2_Click(object sender, RoutedEventArgs e) 
    { 
     aTimer.Stop(); 
    } 

    private void checkBox1_Checked(object sender, RoutedEventArgs e) 
    { 

    } 
} 

任何一个建议.......

+0

您是否尝试使'ischeckboxchecked'字符串直接放入“true”或“false”? – Kilazur

+0

已关闭。了解关于链接问题的回答,以了解WPF如何工作以及如何在多线程场景中正确使用WPF UI功能。 –

+0

@HighCore不是重复的;在另一个问题中讨论的主题与本问题中提出的问题无关。如果它应该被标记为重复,那么应该附带一个广泛的评论,说明数据绑定在这里可能或不可能解决问题。 – Bas

回答

1

您与您的方法调用调度BeginInvokeBeginInvoke立即返回。使用Invoke代替阻止呼叫,并在Dispatcher操作完成后才返回。

+0

从beginInvoke更改为Invoke将解决我的问题。感谢您的快速帮助 – user3274485

+0

@BasBrekelmans投票重新开放。然而,你错误地指责OP,并不是说这在WPF中是非常糟糕的做法,而应该使用DataBinding来代替。 –