这里有一个简单的WPF程序:
<!-- 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));
}
}
目的是当您单击按钮时,第一个标签显示It is coming...
。然后程序休眠3秒钟,最后第二个标签显示It is here!
。但是,下面的天真实现不起作用。如果运行它并单击按钮,则会发生以下情况:程序休眠3秒钟,然后同时显示两个标签文本。你知道如何纠正程序,使其按预期进行吗?
答案 0 :(得分:11)
Button_Click
,你不应该做任何需要超过几毫秒的事情,更不用说睡3秒了。在此期间不处理邮件,您的界面没有响应,并且您的应用程序被认为是#34;挂起&#34;由系统。
因此,长处理任务应由另一个线程处理。
类似的东西(未经测试):
private void Button_Click(object sender, RoutedEventArgs e)
{
Label1Text = "It is coming...";
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (s,e) => {
Thread.Sleep(3000);
}
backgroundWorker.RunWorkerCompleted += (s,e) => {
Label2Text = "It is here!";
}
backgroundWorker.RunWorkerAsync();
}
链接:
答案 1 :(得分:5)
试试这个:
label1.Content = "waiting...";
label1.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
{
label1.UpdateLayout();
}));
System.Threading.Thread.Sleep(3000);
label1.Content = "done!";
答案 2 :(得分:0)
您可以使用故事板和关键帧动画来完成此操作。
http://msdn.microsoft.com/en-us/library/ms742868.aspx
这里有一个很好的例子 -
<Button Name="myAnimatedButton" Margin="200"
FontSize="16pt" FontFamily="Verdana">Some Text
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<StringAnimationUsingKeyFrames
Storyboard.TargetName="myAnimatedButton" Storyboard.TargetProperty="(Button.Content)"
Duration="0:0:8" FillBehavior="HoldEnd">
<!-- All the key frames below are DiscreteStringKeyFrames. Discrete key frames create
sudden "jumps" between values (no interpolation). Only discrete key frames can be used
for String key frame animations. -->
<DiscreteStringKeyFrame Value="" KeyTime="0:0:0" />
<DiscreteStringKeyFrame Value="A" KeyTime="0:0:1" />
<DiscreteStringKeyFrame Value="An" KeyTime="0:0:1.5" />
<DiscreteStringKeyFrame Value="Ani" KeyTime="0:0:2" />
<DiscreteStringKeyFrame Value="Anim" KeyTime="0:0:2.5" />
<DiscreteStringKeyFrame Value="Anima" KeyTime="0:0:3" />
<DiscreteStringKeyFrame Value="Animat" KeyTime="0:0:3.5" />
<DiscreteStringKeyFrame Value="Animate" KeyTime="0:0:4" />
<DiscreteStringKeyFrame Value="Animated" KeyTime="0:0:4.5" />
<DiscreteStringKeyFrame Value="Animated " KeyTime="0:0:5" />
<DiscreteStringKeyFrame Value="Animated T" KeyTime="0:0:5.5" />
<DiscreteStringKeyFrame Value="Animated Te" KeyTime="0:0:6" />
<DiscreteStringKeyFrame Value="Animated Tex" KeyTime="0:0:6.5" />
<DiscreteStringKeyFrame Value="Animated Text" KeyTime="0:0:7" />
</StringAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>