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。

Wpf扩展工具包在运行过程中没有显示BusyIndicator

你的"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)。