Подписаться на событие которое обрабатывается в классе
Предположим, есть класс для работы с zip архивом:
class ArchiveClass
{
public static void AddFileToArchive(string path, string new_path)
{
using(var zip = new ZipFile())
{
zip.Password = "123456";
zip.SaveProgress += SaveProgress;
zip.AddFile(path);
zip.Save(new_path);
}
}
}
Метод SaveProgress должен обращаться к контролам формы (лейбл, прогресс бар).
Как будет правильно, изменить у прогресс бара, например, свойство Value и Maximum?
Я попробовал сделать так:
class MyProgressBar
{
public delegate void ProgressBarEventHandler(ProgressBarEventArgs arg);
public event ProgressBarEventHandler ProgressBarChanged;
private int _value;
public int Val
{
get { return _value; }
set
{
_value = value;
OnProgressBarChange(_value);
}
}
private void OnProgressBarChange(int progress) => ProgressBarChanged?.Invoke(new ProgressBarEventArgs(progress));
public class ProgressBarEventArgs : EventArgs
{
public int Val { get; }
public ProgressBarEventArgs(int value) => this.Val = value;
}
}
Но в таком случае, мне приходиться в методе SaveProgress создавать новый экземпляр класса MyProgressBar, а потом ещё в главной форме создавать опять новый экземпляр класса MyProgressBar и подписываться на него...
короче, какая-то "дичь". Может быть как-то из главной формы можно подписаться на изменение SaveProgress?..
Подскажите, пожалуйста, в каком направлении вообще нужно двигаться.
Ответы (1 шт):
Нужно в метод AddFileToArchive добавить дополнительный параметр с типом события SaveProgress:
public static void AddFileToArchive(string path, string new_path,
SaveProgressEventHandler saveProgress)
{
...
zip.SaveProgress += saveProgress;
...
}
Где-то, допустим, в главной форме должен метод с такой же сигнатурой:
public class Form1 : Form
{
void SaveProgress(...)
{
...
}
}
Его и передаёте в виде делегата:
ArchiveClass.AddFileToArchive("path", "newPath", SaveProgress);