Reputation: 1181
I have a fairly long operation that occurs in a background worker. I have the busy indicator set to true before the operation and false when the operation ends, but the indicator never shows. It shows in other parts of my program, but not this one. heres the code:
<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();
}
}
The mouse override in CboItemId_SelectionChanged works fine when i use it, but i'd rather use the busy indicator. the indicator does pop up AFTER the operation if i just set it to true, and never set it to false.
Upvotes: 0
Views: 1890
Reputation: 37770
Your "background" code isn't background at all. There must be something like this:
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
}
Also, note, that BackgroundWorker
is rather obsolete API. Consider TPL (and, optionally, async/await) instead.
Upvotes: 2