Wpf扩展工具包BusyIndi​​cator在操作期间未显示

时间:2015-05-21 13:27:04

标签: c# wpf wpftoolkit

我在后台工作程序中进行了相当长的操作。我在操作前将忙指示器设置为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();
        }
    }

CboItemId_SelectionChanged中的鼠标覆盖在我使用它时工作正常,但我宁愿使用忙指示符。如果我将其设置为true,则在操作后弹出指示器,并且永远不会将其设置为false。

1 个答案:

答案 0 :(得分:1)

你的背景&#34;代码根本不是背景。必须有这样的东西:

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)。