本文介绍了Wpf 扩展工具包 BusyIndi​​cator 在操作过程中未显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个相当长的操作发生在后台工作人员中.我在操作前将繁忙指示器设置为 true,在操作结束时将其设置为 false,但指示器从未显示.它显示在我程序的其他部分,但不是这一部分.代码如下:

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();
        }
    }

CboItemId_SelectionChanged 中的鼠标覆盖在我使用它时工作正常,但我更愿意使用忙碌指示器.如果我只是将其设置为 true,并且从不将其设置为 false,则该指标会在操作后弹出.

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.

推荐答案

您的背景"代码根本不是背景.一定是这样的:

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
}

另外,请注意,BackgroundWorker 是相当过时的 API.考虑 TPL(以及,可选,async/await) 代替.

Also, note, that BackgroundWorker is rather obsolete API. Consider TPL (and, optionally, async/await) instead.

这篇关于Wpf 扩展工具包 BusyIndi​​cator 在操作过程中未显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-15 06:14