我的窗户上有按钮。 在用户单击按钮之后,我希望我的应用程序动画化加载标签(使用rotationg),在另一个线程期间从数据库获取一些数据 从DB加载数据后,动画必须结束 该任务似乎很简单,但没有用。 问题是动画无论我做什么动画,只有在不需要时才从数据库加载后才开始。

请帮助。 这里有一些代码:

private void LoginButtonClick(object sender, RoutedEventArgs e)
{ 
  Thread thread = new Thread(new ThreadStart(
    delegate()
    {
      DispatcherOperation dispatcherOp =
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
          delegate()
          {
            var da = new DoubleAnimation(360, 0, new Duration(TimeSpan.FromSeconds(1)));
            var rt = new RotateTransform();
            loadingLabel.RenderTransform = rt;
            loadingLabel.RenderTransformOrigin = new Point(0.5, 0.5);
            da.RepeatBehavior = RepeatBehavior.Forever;
            rt.BeginAnimation(RotateTransform.AngleProperty, da);
          }));
      dispatcherOp.Completed += new EventHandler(DispatcherOpCompleted);
    }));
  thread.Start();
}

void DispatcherOpCompleted(object sender, EventArgs e)
{
  //Loading From Database
}

===============>>#1 票数:3 已采纳

Dispatcher.Completed事件在主UI线程上执行。 您的工作线程正在使调度程序操作排队并退出。 无需创建启动动画的线程,然后在Completed处理程序中进行数据库加载,而只需在主线程中启动动画,然后创建工作线程即可进行数据库加载。

private void LoginButtonClick(object sender, RoutedEventArgs e)
{
  var da = new DoubleAnimation(360, 0, new Duration(TimeSpan.FromSeconds(1)));
  var rt = new RotateTransform();
  loadingLabel.RenderTransform = rt;
  loadingLabel.RenderTransformOrigin = new Point(0.5, 0.5);
  da.RepeatBehavior = RepeatBehavior.Forever;
  rt.BeginAnimation(RotateTransform.AngleProperty, da);

  Thread thread = new Thread(new ThreadStart(LoadData));
  thread.Start();
}

void LoadData()
{
  //Loading From Database

  // Use a Dispatch.BeginInvoke here to stop the animation
  // and do any other UI updates that use the results of the database load
}

  ask by B.S. translate from so

未解决问题?本站智能推荐:

2回复

WPF在单独的UI线程上加载动画? (C#)

好的,我有一个加载动画,在填充大型DataTable时运行,让用户知道程序没有冻结。 我有动画工作正常,但它也冻结了DataTable也在更新。 有没有办法拥有多个UI线程,以便在DataTable加载信息时动画将继续运行? 编辑:当前代码如下。 我已经尝试使用Backgrou
1回复

如何在WPF中进行操作之前进行延迟

我尝试使用下面的代码在导航到下一个窗口之前延迟2秒。 但是线程首先调用,并且文本块显示了微秒,然后进入了下一页。 我听说调度员会这样做。 这是我的片段:
2回复

C#WPF调度程序混乱

我应该如何将此代码移植到wpf?
3回复

C#wpf调度程序线程

我正在尝试创建一个新Thread并在某些情况下让它睡觉,但是当我这样做时,主线程睡眠,而不仅仅是我创建的那个。 我正在使用Dispatcher.BeginInvoke但这只是从主线程“授予权限”来访问该方法。 它的工作原理是因为它没有给我一个InvalidOperationExcepti
1回复

如何在C#WPF中完美停止DispatcherTimer

在我的项目中,当我第一次使用“开始按钮”和“停止按钮”启动和结束计时器时,它将正常工作。 但是,当我在不关闭程序的情况下再次按下“开始按钮”时,它开始每间隔插入两次数据,就好像两个计时器在工作一样。 我第三次和第四次重复,它显示了同样的插入错误。 以下是我的摘要代码,我认为这还
2回复

C#WPF调度程序-无法正确处理

我试图在UI中进行更改,然后使我的函数运行,这是我的代码: ui更新后/ ThreadStart'start'结束后我要运行的功能: 那我该怎么办? 谢谢你,丁。
2回复

如何在WPF / C#中检索Dispatcher.BeginInvoke的值

这是我在这个论坛上的第一个问题。 我是法国学生,对不起我的英语。 在我的代码中,我想从Dispatcher.BeginInvoke.提取一个值Dispatcher.BeginInvoke. 这是我的代码中有问题的部分。 这是WorldFarmeCollision的代码,该代码使我感
2回复

C#,WPF,需要时自动调用Dispatcher.Invoke?

我有一个嵌入了Geospace地图的程序。 地图的事件处理在单独的线程上处理,以使地图保持响应(例如,单击地图时触发的事件)。 我遇到的问题是当地图触发一个事件时,我的程序需要更新它的gui中的一些东西,并且还回调到地图以处理在地图上放置图片。 我尝试在this.Dispatche
2回复

在分派器中使用时,C#和WPF循环计数器值未更改

我遇到过这个奇怪的问题,似乎无法找到解决问题的方法。 我正在编写WPF应用程序,并将值加载到ListBox中。 具体来说,该列表框显示了客户端计算机的启动顺序。 因此,列表框项目模板包含4个值。 新序列号(用户更改后的引导顺序),当前(或分配的)序列号(计算机现在的顺序),设备名称以
2回复

c#wpf dispatcher.begin调用冻结

我正在与服务器通信的应用程序上工作。 稍后我需要将结果打印到消息框。 我知道我必须使用Dispatcher,因为我在另一个线程中工作,但是即使我使用beginInvoke方法,我的应用程序也会冻结。 根据Sheridan的答案进行编辑 : 现在我正在获取:WindowsBa