Wpf扩展工具包在运行过程中没有显示BusyIndicator
本文关键字:显示 BusyIndicator 过程中 运行 扩展 工具包 Wpf | 更新日期: 2023-09-27 17:50:25
我有一个在后台worker中发生的相当长的操作。在操作之前,我将忙碌指示器设置为true,在操作结束时设置为false,但指示器从未显示。在我的程序的其他部分也有,但这个没有。下面是代码:
<xctk:BusyIndicator DockPanel.Dock="Top" Name="ItemSearchBusyIndicator" >
<Grid Height="35" Name="grid1" Width="445" DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="382*" />
<ColumnDefinition Width="39*" />
</Grid.ColumnDefinitions>
<RadioButton Content="Direct Entry" Height="16" HorizontalAlignment="Left" Margin="212,10,0,0" Name="RdoDirectEntry" VerticalAlignment="Top" IsChecked="False" Checked="RdoDirectEntry_Checked" FontSize="14" />
<RadioButton Content="Item Search" Height="16" HorizontalAlignment="Left" Margin="0,10,0,0" Name="RdoItemSearch" VerticalAlignment="Top" Checked="RdoItemSearch_Checked" FontSize="14" />
<RadioButton Content="Route Search" Height="16" HorizontalAlignment="Left" Margin="102,10,0,0" Name="RdoRouteSearch" VerticalAlignment="Top" Checked="RdoRouteSearch_Checked" FontSize="14" />
<RadioButton Content="File System Search" Height="16" HorizontalAlignment="Left" Margin="310,11,0,0" Name="RdoFileSystem" VerticalAlignment="Top" FontSize="14" Grid.ColumnSpan="2" Checked="RdoFileSystem_Checked" />
</Grid>
</xctk:BusyIndicator>
private void CboItemId_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
BackgroundWorker _backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
_backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted);
ItemSearchBusyIndicator.IsBusy = true;
// Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
if (RdoItemSearch.IsChecked == false) return;
backgroundWorker_DoWork(null, null);
// Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
ItemSearchBusyIndicator.IsBusy = false;
}
public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (CboItemId.SelectedValue == null) return;
if (CboItemId.SelectedValue.ToString() != string.Empty)
LoadItemData(CboItemId.SelectedValue.ToString());
}
public void LoadItemData(string itemId)
{
Axapta ax = new Axapta();
files.Clear();
try
{
ax.Logon(Settings.Default.Server, null, Settings.Default.Test, null);
AxaptaContainer path = (AxaptaContainer)ax.CallStaticClassMethod(Settings.Default.ClassName, Settings.Default.ItemData, itemId);
for (int i = 1; i <= path.Count; i++)
{
AxaptaContainer somestring = (AxaptaContainer)path.get_Item(i);
for (int j = 1; j <= somestring.Count; j += 2)
{
string extension = Path.GetExtension(somestring.get_Item(j + 1).ToString().ToLower());
if (extension == ".jpg"
|| extension == ".jpeg"
|| extension == ".gif"
|| extension == ".png"
|| extension == ".bmp"
|| extension == ".pdf")
/* key=path - value=description */
files.Add(somestring.get_Item(j + 1).ToString(), somestring.get_Item(j).ToString());
}
}
if (path.Count == 0)
{
MessageBox.Show("No Documents Found");
}
_canvas.Children.Clear();
LoadPictures();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
ax.Logoff();
}
}
鼠标覆盖在chboitemid_selectionchanged工作很好,当我使用它,但我宁愿使用繁忙的指标。如果我将其设置为true,则该指示器会在操作后弹出,而不会将其设置为false。
你的"background"代码根本就不是背景。一定有这样的内容:
private void CboItemId_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// turn indicator ON
ItemSearchBusyIndicator.IsBusy = true;
var _backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += backgroundWorker_DoWork;
_backgroundWorker.RunWorkerCompleted += _backgroundWorker_RunWorkerCompleted;
// start background operation;
// direct call to backgroundWorker_DoWork just calls method synchronously
_backgroundWorker.RunWorkerAsync();
}
private void _backgroundWorker_RunWorkerCompleted(/* I don't remember signature */)
{
// turn indicator OFF
ItemSearchBusyIndicator.IsBusy = false;
// other code
}
还要注意,BackgroundWorker
是相当过时的API。请考虑TPL(以及可选的async/await)。