2010-07-25 3 views
4

코드에서 dispatcherTimer의 사용과 관련하여 질문이 있습니다. 아래에있는 내 상황을보고하십시오 :dispatcherTimer.Stop을 다른 함수로 사용하는 방법?

private void CheckShow(object sender, System.Windows.RoutedEventArgs e) 
{ 
    DispatcherTimer dispatcherTimer = new DispatcherTimer(); 

    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1); 
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);    
    dispatcherTimer.Start(); 
    string etime = DateTime.Now.Second.ToString();  
} 

private void dispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    if(System.IO.File.Exists(@"C:\Default.xml")) 
    { 
     LoadingRecent.Text = "Loading Default Show..."; 
     LoadBar.Opacity = 100; 
     string time1 = DateTime.Now.Millisecond.ToString(); 
     string time2 = DateTime.Now.Second.ToString(); 
     double huidigetijd = System.Convert.ToDouble(time2 + "." + time1); 
     LoadBar.Value = huidigetijd; 
     Remainingnummer.Text = Convert.ToString(10 - DateTime.Now.Second); 

     string etime = DateTime.Now.Second.ToString(); 
     if (etime == "10") 
     { 
      var provider = (XmlDataProvider)this.Resources["CUEData"]; 
      var loadfilepath = @"C:\Default.xml"; 
      provider.Source = new Uri(loadfilepath, UriKind.Absolute); 
      Storyboard Hoofdvenster = (Storyboard)Resources["Hoofdvenster"]; 
      Hoofdvenster.Begin(this, true); 
     } 

당신이 정상 기능에서 볼 수 있듯이 나는 타이머를 시작하고 타이머가 10 초에 도달하면 다음 틱에 나는 몇 가지 물건을한다. 그러나 if 문에서 dispatchertimer를 중지하고 싶지만 문맥 오류가 발생합니다.

그래서 다른 기능에서 타이머를 멈추게하려면 어떻게해야합니까?

업데이트 : 나는 당신의 솔루션에 맞게 시도하지만 객체 참조가 인스턴스 오류

public void CheckShow(object sender, System.Windows.RoutedEventArgs e) 
{ 
    DispatcherTimer dispatcherTimer = new DispatcherTimer(); 

    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1); 
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);    
    dispatcherTimer.Start(); 
    string etime = DateTime.Now.Second.ToString(); 

    if (etime == "13") 
    { 
     dispatcherTimer.Stop(); 
     LoadingRecent.Text = "You are currently working on a show. Press New or Load to create or load a different show"; 
     LoadBar.Opacity = 0; 
    } 
} 
private DispatcherTimer dispatcherTimer;  
private void dispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    if(System.IO.File.Exists(@"C:\Default.xml")) 
    { 
     LoadingRecent.Text = "Loading Default Show..."; 
     LoadBar.Opacity = 100; 
     string time1 = DateTime.Now.Millisecond.ToString(); 
     string time2 = DateTime.Now.Second.ToString(); 
     double huidigetijd = System.Convert.ToDouble(time2 + "." + time1); 
     LoadBar.Value = huidigetijd; 
     Remainingnummer.Text = Convert.ToString(10 - DateTime.Now.Second); 

     string etime = DateTime.Now.Second.ToString(); 
     if (etime == "10") 
     { 
      var provider = (XmlDataProvider)this.Resources["CUEData"]; 
      var loadfilepath = @"C:\Default.xml"; 
      provider.Source = new Uri(loadfilepath, UriKind.Absolute); 
      Storyboard Hoofdvenster = (Storyboard)Resources["Hoofdvenster"]; 
      Hoofdvenster.Begin(this, true); 
      dispatcherTimer.Stop(); 
     } 

답변

5

당신은 DispatcherTimer 인스턴스를 포함하는 클래스 내에서 private 필드를 사용으로 설정되지 얻을. 그런 다음 클래스의 모든 비 정적 메소드에서 액세스 할 수 있습니다.

는 편집 : 추가

당신에게 샘플을 제공하기 위해 샘플, 나는 어떤 콘텐츠입니다 업데이 트마다 두 번째 TextBlock의를 포함하는 간단한 WPF 응용 프로그램을 개발했다. 5 초 후 타이머가 꺼집니다. 이것은 XAML입니다 :

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TextBlock Text="{Binding Path=Counter}" /> 
    </Grid> 
</Window> 


그리고 이것은 코드 숨김입니다 :

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     dispatcherTimer = new DispatcherTimer(); 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1, 0); 
     dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
     dispatcherTimer.Start(); 
    } 

    private DispatcherTimer dispatcherTimer; 

    private int counter; 
    public int Counter 
    { 
     get { return counter; } 
     set 
     { 
      counter = value; 
      OnPropertyChanged("Counter"); 
     } 
    } 

    private void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 
     Counter++; 
     if (Counter == 5) 
     { 
      dispatcherTimer.Stop(); 
      dispatcherTimer = null; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler e = PropertyChanged; 
     if (e != null) 
     { 
      e(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 


희망이 도움이됩니다. 문안 인사.

+0

을 어떻게 그 일이 것? 예를 들어 줄 수 있습니까? – internetmw

+0

여러 가지를 시도했지만 오류가 계속 발생합니다. 객체 참조가 객체의 인스턴스로 설정되지 않았습니다 ... – internetmw

+1

CheckShow 내부에서 "DispatcherTimer dispatcherTimer = new DispatcherTimer();"를 사용하고 있습니다. "dispatcherTimer = new DispatcherTimer();"로 바꾸십시오. –

0

이 작품 :)

public MainWindow() 
    { 
     InitializeComponent(); 
     DispatcherTimer dispatcherTimer = new DispatcherTimer(); 
     dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 1); 
     dispatcherTimer.Start(); 


    } 

    private void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 
      //Do Something 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 

     Dispatcher.InvokeShutdown(); 
    } 
관련 문제