I have a WPF/C# program with several classes, and the MainWindow.cs class has user controls which I’d like to update with the status of the computation occurring inside other classes. After googling around and borrowing from examples, I figured out how to set up an Event inside the other class, and invoking it when something changed. Then as long as the main class has a handler tied that event, I could appropriately update UI stuff (status bars, etc). Below is a stripped-down version of what I’m doing:
namespace Program
{
public partial class MainWindow : Window
{
public void SetUpHandler()
{
TestA.WorkerProgressThingie += new ProgressChangedEventHandler(TestA_ProgressChanged);
}
void TestA_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage
}
}
public class TestA
{
public static event ProgressChangedEventHandler WorkerProgressThingie;
public static void SomeFunction()
{
int value = 0;
//...(some boring code that does something here)
ProgressChangedEventArgs e = new ProgressChangedEventArgs(value, null);
if (WorkerProgressThingie != null)
WorkerProgressThingie.Invoke(null, e)
}
}
}
- Is there not a way to simply call the progressBar property from the other class? (i.e. MainWindow.progressBar.Value)?
- What is the purpose of the “object sender” parameter when I invoke the event, and how is it supposed to be used normally? The examples I see always use ‘null’.
Thanks!
1) Yes, you can access any part of any class if it is declared
public. In this case, you could declare the progressBar control as public, and anything that has a reference toclass MainWindowcan fiddle with it. HOWEVER, this would be pretty poor practice. Instead, you could bind to some ‘value’ which updates in relation to the current progress of the activity and let the MainWindow class worry about how it represents that change (in this case by updating a ProgressBar),2)
object senderin all events is meant to be a reference to the object which raised the event, so the event consumer knows where the event came from. Using null is also poor practice IMO, and in general, an object which raises an event should do so like;