Die Umsetzung einer pause in WPF
Hier haben Sie eine einfache WPF-Programm:
<!-- Updater.xaml -->
<Window x:Class="Update.Updater"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<StackPanel>
<Button Click="Button_Click" Height="50"></Button>
<Label Content="{Binding Label1Text}" Height="50"></Label>
<Label Content="{Binding Label2Text}" Height="50"></Label>
</StackPanel>
</Grid>
</Window>
//Updater.xaml.cs
using System.Threading;
using System.Windows;
namespace Update
{
public partial class Updater : Window
{
public Updater()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Label1Text = "It is coming...";
Thread.Sleep(3000);
Label2Text = "It is here!";
}
public string Label1Text
{
get { return (string)GetValue(CategoryProperty); }
set { SetValue(CategoryProperty, value); }
}
static readonly DependencyProperty CategoryProperty = DependencyProperty.Register("Label1Text", typeof(string), typeof(Updater));
public string Label2Text
{
get { return (string)GetValue(Label2TextProperty); }
set { SetValue(Label2TextProperty, value); }
}
static readonly DependencyProperty Label2TextProperty = DependencyProperty.Register("Label2Text", typeof(string), typeof(Updater));
}
}
Die Absicht ist, dass, wenn Sie auf die Schaltfläche klicken, wird das erste label angezeigt It is coming...
. Dann das Programm Schlafmöglichkeiten für 3 Sekunden, und schließlich der zweite Etikett zeigt It is here!
. Allerdings, die naive Implementierung unten funktioniert nicht. Wenn Sie starten Sie es und klicken Sie auf die Schaltfläche passiert Folgendes: Das Programm wartet 3 Sekunden, und dann die beiden label-Texte gleichzeitig angezeigt werden. Wissen Sie, wie korrigieren Sie das Programm so, dass es funktioniert wie vorgesehen?
InformationsquelleAutor user181813 | 2012-04-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Button_Click
aufgerufen wird, indem Sie den UI-thread, und Sie sollte nicht alles tun, die mehr als ein paar Millisekunden drin, geschweige denn schlafen für 3 Sekunden. Nachrichten werden nicht verarbeitet in dieser Zeit Ihre Oberfläche nicht mehr reagiert, und Ihre Anwendung ist als "hung" durch das system.So, dass lange die Bearbeitung der Aufgabe umgegangen werden soll, die von einem anderen thread.
Etwas wie (ungetestet):
Links:
BackgroundWorker
Erstellen Von Responsive Apps Mit Dem Dispatcher
InformationsquelleAutor Nicolas Repiquet
Versuchen Sie dies:
label1.UpdateLayout();
ohne Verwendung der dispatcher?Ja, es ist, es wird nicht funktionieren, nur durch den Aufruf der UpdateLayout. Die Methode gibt sofort einen Wert zurück und plant das update für später in der UI-thread (wahrscheinlich, wenn die Schaltfläche Click-Ereignis beendet ist). Dann wird der thread schläft für 3 Sekunden, und plant eine weitere änderung, und wenn das Button-Click-Methode beendet ist, wird der UI-thread zeichnet schließlich die Sicht. In Windows-Formularen, die Sie verwenden können, einfach die Update-Methode auf dem Etikett, aber WPF funktioniert anders.
InformationsquelleAutor Gorgi Rankovski
Können Sie ein storyboard und die keyframe-animation zu tun.
http://msdn.microsoft.com/en-us/library/ms742868.aspx
Gibt es ein gutes Beispiel in der hier -
http://msdn.microsoft.com/en-us/library/system.windows.media.animation.stringanimationusingkeyframes.aspx
InformationsquelleAutor Dror