【问题标题】:Wpf Extended toolkit BusyIndicator not showing during operationWpf 扩展工具包 BusyIndi​​cator 在操作期间未显示
【发布时间】:2015-05-21 13:27:03
【问题描述】:

我有一个相当长的操作发生在后台工作人员中。我在操作前将繁忙指示器设置为 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,则该指示器会在操作后弹出。

【问题讨论】:

    标签: c# wpf wpftoolkit


    【解决方案1】:

    您的“背景”代码根本不是背景。一定有这样的:

    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(以及可选的异步/等待)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-16
      • 2016-07-13
      • 2016-03-22
      • 2011-09-17
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2011-06-01
      相关资源
      最近更新 更多