Лучшая практика с Winforms, которые обновляются извне - PullRequest
0 голосов
/ 13 октября 2010

Мне интересно, будет ли хорошей идеей сделать ярлыки общедоступными, чтобы другие классы могли изменить их и получить их значение. Это хорошая идея? Если нет, то как это сделать тогда?

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Я бы не стал публиковать лейбл.

Было бы лучше добавить публичный метод, который был бы специфичен для отображения метки, и попросить его обновить метку.

Например, если ваша метка была меткой «Состояние системы», вы можете добавить (к вашей форме / UserControl):

public void SetStatusInformation(string currentStatus)
{
     this.statusLabel.Text = currentStatus;
}

Это позволяет позже изменить способ отображения этой информации (в случае, если вы хотите использовать другой элемент управления), а также упростить ваш API, поскольку публичные методы очень понятны для пользователя.

1 голос
/ 13 октября 2010

это плохая идея.WinForms оставляет много "как лучше всего делать X?"открытые вопросы;и ваш лучший ответ - следовать установленным шаблонам и практикам (которые не относятся к WinForms).

Ознакомьтесь с шаблонами MVP или MVC.Оба они являются высокоуровневыми шаблонами, которые направлены на отделение вашего кода, специфичного для пользовательского интерфейса, от вашей бизнес-логики.Без этого разделения ваше приложение может быстро превратиться в кошмар обслуживания, а вещи, которые должны быть простыми, станут намного сложнее.

Для вашего конкретного сценария вы, скорее всего, в конечном итоге получите модель (вашу бизнес-логику), которая использует привязку данныхчтобы показать его данные на экране WinForms.Когда происходит изменение в пользовательском интерфейсе, это будет Модель, которая получает это изменение, и это изменение будет распространяться на пользовательский интерфейс через привязку данных.

0 голосов
/ 13 октября 2010

Я бы предложил обернуть в свойство или метод setter, потому что очень возможно, что вам нужно будет что-то сделать, например добавить запись в журнал или повторно вызвать основной поток окна, если вызывающий объект из другого. Я обнаружил, что проще просто всегда использовать код, подобный следующему, при представлении функциональности, которая позволяет клиентам обновлять что-либо графическое.

public void SetStart()
    {
        if (this.InvokeRequired)
        {
            this.Invoke((MethodInvoker)delegate()
            {
                this.SetStart();
            });
        }
        else
        {
            progressBar1.Value = 0;
            progressBar1.Visible = true;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...