设置“可见性”属性不显示控件

时间:2013-12-23 09:36:27

标签: c# wpf multithreading visibility

我在旋转器控件的可见性方面遇到了问题。 控件本身有效...如果我在初始化之后将其设置为可见,则按预期显示和动画。

但是,如果我试图从代码中显示它,它永远不会被绘制......

.cs文件(演示者)

private void SaveDocument(Document aDocument)
{
  if (AllowFlag != null)
  {
    this.View.ShowDocumentProgressSpinner(true);
    this.Save(aDocument);
    this.View.ShowDocumentProgressSpinner(false);
  }
}

xaml.cs文件

void IDocumentView.ShowDocumentProgressSpinner(bool show)
{
  if (show)
  {
    this.DocumentProgressSpinner.Visibility = Visibility.Visible;
  }
  else
  {
    this.DocumentProgressSpinner.Visibility = Visibility.Hidden;
  }
}

如果我在初始化微调器工作后立即将可见性设置为可见!

主控件的xaml的一部分(微调器是自定义控件)

...
      <Viewbox Grid.Row="3" Width="30" Height="30"
                HorizontalAlignment="Center"
                VerticalAlignment="Center">
        <my:DocumentProgressSpinnerView x:Name="DocumentProgressSpinner" />
...

可能是另一个线程问题,但我也尝试过:

Thread.CurrentThread == Dispatcher.CurrentDispatcher.Thread

TRUE

Dispatcher.FromThread(Thread.CurrentThread).CheckAccess()

TRUE

控件被调用,因为&#34; windows微调器&#34;被激活,只是控件永远不会显示...

1 个答案:

答案 0 :(得分:2)

问题是您在调度程序线程上运行保存操作,并且在保存操作期间,调度线程一直被阻塞。只有在您的保存操作完成后,UI才会更新,因此您永远不会看到“等待”状态。相反,您应该从事件调度中旋转一个新线程,并将等待指示器设置为可见。在单独的线程中执行保存操作,保存完成后,使用调度程序在Dispatcher线程上再次隐藏等待指示符。

有关如何实现此目的的详细信息,请参阅this answer