Я занимаюсь разработкой простого приложения Windows Forms в C#Form1_Load не называется (попытка иметь BackgroundWorker)
Я хочу, чтобы показать GUI, а затем запустить некоторые задачи в фоновом режиме. Я хотел бы показать прогресс этих задач, используя текстовую метку в формах.
Program.cs довольно проста:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form mainForm = (new Form1());
Application.Run(mainForm);
}
Для ярлыке я обвязку
partial class Form1 : INotifyPropertyChanged
{
public string Title
{
get { return _title; }
set
{
_title = value;
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Title"));
}
}
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this, "Title", true));
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(46, 17);
this.label1.TabIndex = 0;
this.label1.Text = "label1";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(763, 255);
this.Controls.Add(this.label1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();
}
private string _title = "xxgg";
private System.Windows.Forms.Label label1;
public event PropertyChangedEventHandler PropertyChanged;
И тогда я хотел бы запустить фоновый рабочий, но по какой-то причине метод Form1_Load не выполняется.
private void Form1_Load(object sender, System.EventArgs e)
{
System.Console.WriteLine("Form loaded");
var bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerAsync(); //Start the worker
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
InfoText it = new InfoText();
FileMover fm = new FileMover(it);
foreach(string path in sourcePaths)
{
fm.MoveFrom(path);
this.Title = it.text;
}
}
Как вы можете видеть, я хочу обновить заголовок во время работы фонового работника.
В чем причина того, что моя Form1_Load не называется? Спасибо
Edit: Я добавил код BackgroundWorker в классе Form1, как это:
public partial class Form1 : Form
{
BackgroundWorker bw;
public Form1()
{
InitializeComponent();
it = new InfoText();
bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.WorkerReportsProgress = true;
bw.ProgressChanged += Bw_ProgressChanged;
bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
bw.RunWorkerAsync(); //Start the worker
}
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("done");
this.Title = it.text;
}
private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Console.WriteLine("progress changed " + e.ProgressPercentage);
this.Title = it.text;
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
FileMover fm = new FileMover(it);
foreach(string path in sourcePaths)
{
fm.MoveFrom(path);
bw.ReportProgress(1);
}
}
}
Теперь он делает именно то, что я хотел.
Потому что он не зарегистрирован в форме в любом месте ... – fabrosell
Вместо этого запишите его в OnLoad. Не обращайтесь к элементам GUI из метода DoWork. – LarsTech
My Form1_Load теперь вызывается благодаря @fabrosell, но Title не обновляется. Что вы имеете в виду, написав его в OnLoad? – rluks