正确显示 BusyIndicator
Displaying the BusyIndicator correctly
我有一个 WPF C# 应用程序。
我正在使用 Xceeed.wpf 工具包
在伪代码中,我的函数将:
- 显示 BusyIndicator
- 对我的服务器进行了 REST API 调用
- BusyIndicator 停止显示
实际情况是,在 REST API 调用完成之前,BusyIndicator 不会显示。有时它会显示,但 'marque' 效果不流畅。
我尝试了几种方法,这是我最近的尝试:
// 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>
您必须等到 Task
完成后才能关闭 BusyIndicator。目前,您只是启动任务并将繁忙指示器设置为关闭。
将您的方法标记为异步并等待 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());
我有一个 WPF C# 应用程序。
我正在使用 Xceeed.wpf 工具包
在伪代码中,我的函数将:
- 显示 BusyIndicator
- 对我的服务器进行了 REST API 调用
- BusyIndicator 停止显示
实际情况是,在 REST API 调用完成之前,BusyIndicator 不会显示。有时它会显示,但 'marque' 效果不流畅。
我尝试了几种方法,这是我最近的尝试:
// 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>
您必须等到 Task
完成后才能关闭 BusyIndicator。目前,您只是启动任务并将繁忙指示器设置为关闭。
将您的方法标记为异步并等待 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());