c# - 正确显示 BusyIndi​​cator

标签 c# wpf xceed

我有一个 WPF C# 应用。

我正在使用 Xceeed.wpf 工具包

在伪代码中,我的函数将:

  • 显示 BusyIndi​​cator
  • 对我的服务器进行了 REST API 调用
  • BusyIndi​​cator 停止显示

实际情况是,在 REST API 调用完成之前,BusyIndi​​cator 不会显示。有时它会显示,但“品牌”效果不流畅。

我尝试了几种方法,这是我最近的尝试:

// raise event to invoke method call on main UI page
// event raised here

Task.Run(() =>
{
    // makes API call
    busyIndicator.IsBusy = false;

);

public void ShowBusy()
{
    this.InvokeOnMainThread(() =>
    {
        busyIndicator.IsBusy = true;
    });
}

public static void InvokeOnMainThread(this Control control, Action method)
{
    if (!control.Dispatcher.CheckAccess())
    {            Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, method);
        return;
    }
    method();
}

标记:

    <xctk:BusyIndicator Name="busyIndicator" Grid.Column="1" Grid.Row="1" IsBusy="True" DisplayAfter="0" Background="White" BorderBrush="White">
        <xctk:BusyIndicator.BusyContentTemplate  >
            <DataTemplate>
                <StackPanel Height="50">
                    <TextBlock HorizontalAlignment="Center">Please wait...</TextBlock>
                    <WPFSpark:FluidProgressBar  Oscillate="True" Width="400"   Foreground="DarkGreen" BorderBrush="White" Opacity="1" />
                </StackPanel>                 
            </DataTemplate>
        </xctk:BusyIndicator.BusyContentTemplate>
        <xctk:BusyIndicator.OverlayStyle>
            <Style TargetType="Rectangle">
                <Setter Property="Fill" Value="White"/>                    
            </Style>
        </xctk:BusyIndicator.OverlayStyle>
        <xctk:BusyIndicator.ProgressBarStyle>
            <Style TargetType="ProgressBar">
                <Setter Property="BorderBrush" Value="white"></Setter>
                <Setter Property="Visibility" Value="Collapsed"/>
            </Style>
        </xctk:BusyIndicator.ProgressBarStyle>
        <xctk:BusyIndicator.Content>
               //my usercontrol which invokes the call
        </xctk:BusyIndicator.Content>
</xctk:BusyIndicator>

最佳答案

在关闭 BusyIndi​​cator 之前,您必须等到 Task 完成。目前,您只是启动任务并将忙碌指示器设置为关闭。

将您的方法标记为异步并等待 API 调用。

busyIndicator.IsBusy = true;
await Task.Run(() =>
{
    //makes api call
);
busyIndicator.IsBusy = false;

如果..出于某种原因,您不能使用 async/await,则使用 continuation。

  Task.Run(() =>
  {
      //makes api call
  }).ContinueWith(antecedent =>
  {
      busyIndicator.IsBusy = false;
  }, TaskScheduler.FromCurrentSynchronizationContext());

关于c# - 正确显示 BusyIndi​​cator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35340682/

相关文章:

c# - nopcommerce 从新闻页面拉取图片

c# - windows.web.http 和 ByteArray

c# - CSharpAddImportCodeFixProvider 遇到错误并已被禁用

wpf - 将 StackPanel 切换并灰显

wpf - DevExpress Grid 是否与 MVVM 和命令一起使用(我能找到的只有事件)

c# - WPF - 在 Extended WPF Toolkit 中自定义 MessageBox 的样式

c# - mysql表没有得到更新

c# - 文本框验证奇怪的行为

c# - WPF DataGrid - 在行选择/失去焦点时防止颜色变化

c# - 扩展的 WPF 工具包在 Visual Studio 输出窗口中过于冗长