【问题标题】:Toolbox items grayed out in VS 2010工具箱项目在 VS 2010 中灰显
【发布时间】:2011-06-02 23:52:10
【问题描述】:

我已经尝试过无数次尝试来解决这个问题或错误,首先是从 C:\Users\\AppData\Local\Microsoft\VisualStudio\x.0 中删除 .tbd 文件

我也试过这个:

Visual Studio“工具”菜单 “选项”子菜单 “Windows 窗体设计器”选项卡 “常规选项卡 将“AutoToolboxPopulate”设置为“True”

工具箱列表仍未正确填充,我需要的“BackgroundWorker”组件显示为灰色。有什么想法吗?

【问题讨论】:

  • 你能发布一个(链接到一个)屏幕截图吗?它可能会显示您错过的内容。
  • 您需要记录项目类型。一种修复方法是右键单击工具箱并单击重置。
  • @ChrisF,这是链接:dl.dropbox.com/u/14305935/BGW.png
  • 奇怪的工具箱。不,Silverlight 项目不支持 Winforms 组件。您应该记录您的项目类型。
  • 这是一个WPF项目,我需要的组件是BackgroundWorker。一定有办法以WPF形式实现BackgroundWorker!

标签: visual-studio visual-studio-2008 visual-studio-2010 toolbox


【解决方案1】:

我找到了解决我的问题的方法,在 C# 中使用 BackgroundWorker 类而不使用工具箱中的组件。在这种情况下,我需要两个单独的 backgroundWorker:

using System.Threading;

public partial class MainWindow : Window
    {
        private BackgroundWorker bw1 = new BackgroundWorker();
        private BackgroundWorker bw2 = new BackgroundWorker();

        public MainWindow()
        {
            InitializeComponent();

            bw1.WorkerReportsProgress = true;
            bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
            bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted);
            bw1.ProgressChanged += new ProgressChangedEventHandler(bw1_ProgressChanged);

            bw2.WorkerReportsProgress = true;
            bw2.DoWork += new DoWorkEventHandler(bw2_DoWork2);
            bw2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw2_RunWorkerCompleted);
            bw2.ProgressChanged += new ProgressChangedEventHandler(bw1_ProgressChanged);
        }


        private void bw1_DoWork(object sender, DoWorkEventArgs e)
        {
            StatsProcessor proc = new StatsProcessor();
            proc.CompareStats(listText1, listText2);    
        }

        private void bw2_DoWork2(object sender, DoWorkEventArgs e)
        {
            StatsParser parser = new StatsParser();
        }

        private void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar2.IsIndeterminate = false;
            progressBar2.Value = 100;

            btnCompareStats.IsEnabled = true;

        }

        private void bw2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar1.IsIndeterminate = false;
            progressBar1.Value = 100;

            btnFetchStats.IsEnabled = true;
        }

        private void bw1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar2.Value = e.ProgressPercentage;
        }

        private void bw2_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }

        private void btnCompare_Click(object sender, EventArgs e)
        {
            btnCompareStats.IsEnabled = false;

            StatsProcessor proc = new StatsProcessor();

            if (bw1.IsBusy != true)
                    {
                        progressBar2.IsIndeterminate = true;

                        // Start the asynchronous operation.
                        bw1.RunWorkerAsync();
                    }       

        }

        private void btnFetchStats_Click(object sender, RoutedEventArgs e)
        {
            btnFetchStats.IsEnabled = false;

            if (bw2.IsBusy != true)
                {
                       progressBar1.IsIndeterminate = true;

                       // Start the asynchronous operation.
                       bw2.RunWorkerAsync();
                }
        }
}

【讨论】:

    【解决方案2】:

    至少有一个解决方法:在代码中声明BackgroundWorker,但不要忘记正确处理它:

    public class MyForm : Form
    {
      private BackgroundWorker bgWorker = null;
    
      public MyForm()
      {
        InitializeComponent();
    
        this.bgWorker = new BackgroundWorker; //TODO: set properties and event handlers
      }
    
      public override void Dispose(bool disposing)
      {
        //TODO: copy from MyForm.Designer.cs and add:
        Backgroundworker bgw = this.bgWorker;
        this.bgWorker = null;
        if (disposing && bgw != null)
        {
          try
          {
          //TODO: release event handlers
          bgw.Dispose();
          }
          catch(Exception)
          {
            /* consumed disposal error */
          }
        }
      }
    }
    

    【讨论】:

    • 但是我们无法将组件添加到WPF表单中,那么如何实现backgroundWorker1_DoWork()和backgroundWorker1_RunWorkerCompleted()呢?
    • 您可以简单地在代码中注册事件,例如bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(bgw_DoWork);和一个方法 private void DoWorkEventHandler(object sender, DoWorkEventArgs e) {...}
    • 您下面的代码似乎完全使用了我在上面起草的内容,在这种情况下,您能否使用投票按钮给我一些声誉,好吗? ;)
    【解决方案3】:

    我会尝试重置工具箱项目。然后使用“添加项目”对话框放回您需要的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2011-01-02
      • 2021-12-16
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多