2016-05-03 1 views
0

Dies ist eine Antwort auf eine vorherige Frage How to display a clock with the current time in a Windows Core IoT app? modelliert, erhalte ich eine Ausnahme: "Die Anwendung rief eine Schnittstelle, die für einen anderen Thread marshalled wurde." Wenn ich die Eigenschaft mit einem Klickereignis ändere, funktioniert die Bindung.Clock-Programm mit ThreadPoolTimer C# uwp

public class RunClock: INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
    ThreadPoolTimer _clockTimer = null; 
    private string clock=""; 
    public string Clock 
    { 
     set 
     { 
      clock= value; 
      this.OnPropertyChanged(); 
     } 
     get { return clock; } } 
    public RunClock() 
    { 

     _clockTimer = ThreadPoolTimer.CreatePeriodicTimer(_clockTimer_Tick, TimeSpan.FromMilliseconds(1000));    
    private void _clockTimer_Tick(ThreadPoolTimer timer) 
    { 
     DateTime datetime = DateTime.Now; 
     Str1 = datetime.ToString(); 
    } 
    public void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

und XAML:

<TextBlock Margin="15" Name="timec" Text="{x:Bind Path=RunClock.Clock, Mode=OneWay}"></TextBlock> 

Vielen Dank im Voraus!

aktualisieren, Arbeitscode:

public class test : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
    ThreadPoolTimer _clockTimer = null; 
    private string str1 = ""; 
    public string Str1 
    { 
     set 
     { 
      str1 = value; 
      this.OnPropertyChanged(); 
     } 
     get { return str1; } 
    } 
    public test() 
    { 

     _clockTimer = ThreadPoolTimer.CreatePeriodicTimer(_clockTimer_Tick, TimeSpan.FromMilliseconds(1000)); 
       } 
    async private void _clockTimer_Tick(ThreadPoolTimer timer) 
    { 
     await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      DateTime dt = DateTime.Now; 
      Str1 = dt.ToString(); 
     }); 
    } 
    public void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

XAML (test1 ist eine Instanz er Ansichtsmodell):

   <TextBlock Margin="15" Name="timec" Text="{x:Bind test1.Str1, Mode=OneWay}"></TextBlock> 

Antwort

0

Ausnahme ist, weil Ihr versucht UI in anderen Thread

Verwendung zu ändern dies

private void _clockTimer_Tick(ThreadPoolTimer timer) 
    { 
     var dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher; 
     await dispatcher.RunAsync(
     CoreDispatcherPriority.Normal,() => 
     { 
     // Your UI update code goes here! 
     DateTime datetime = DateTime.Now; 
     Str1 = datetime.ToString(); 
     }); 
    } 
+0

Mit yo UR-Code Ich habe 'System.NullReferenceException' "Zusätzliche Informationen: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt." Aber ich suchte es und fand Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync (CoreDispatcherPriority.Normal,() => {UI-Code}); und es hat funktioniert. Vielen Dank! – rur2641

+0

@ rur2641 Ja. Eigentlich habe ich das gemeint. Ich werde die Antwort aktualisieren – Archana

+0

können Sie bitte diese Frage überprüfen? http://stackoverflow.com/questions/37508726/using-threadpooltimer-with-background-audio-uwp – yalematta