Вопрос по wpf, c# – Реализация паузы в WPF

1

Здесь у вас есть простая программа 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 секунд, а затем два текста меток отображаются одновременно. Знаете ли вы, как исправить программу, чтобы она делала так, как задумано?

Ваш Ответ

3   ответа
11

Button_Click вызывается потоком пользовательского интерфейса, и выshould not делайте все, что требует более нескольких миллисекунд, не говоря уже о том, чтобы спать в течение 3 секунд. В течение этого времени сообщения не обрабатываются, ваш интерфейс не отвечает, и ваше приложение считается "зависшим". по системе.

Таким образом, эта длинная задача обработки должна быть обработана другим потоком.

Нечто подобное (не проверено):

    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();
    }

Ссылки:

BackgroundWorker

Создавайте более отзывчивые приложения с помощью Dispatcher

0

Вы можете использовать раскадровку и анимацию ключевых кадров, чтобы сделать это.

http://msdn.microsoft.com/en-us/library/ms742868.aspx

Здесь хороший пример -

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.stringanimationusingkeyframes.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>
5

Попробуй это:

label1.Content = "waiting...";

label1.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate()
   {

        label1.UpdateLayout();
    }));

System.Threading.Thread.Sleep(3000);
label1.Content = "done!";
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededlabel1.UpdateLayout();Error: User Rate Limit Exceeded user181813

Похожие вопросы