Обнаружение изменения источника (пользователя или программы) в переключателях - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь установить флаг, указывающий, было ли последнее изменение в свойстве Checked вызвано пользователем или программой.

Я использую пользовательский RadioButton:

public class MyRadioButton : RadioButton
{
    ValueChanger valueChanger = ValueChanger.Program;

    public MyRadioButton()
    {
        this.Click += OnButtonClickedByUser;
        this.CheckedChanged += OnCheckChange;
    }

    public void setChecked(bool val)
    {
        this.valueChanger = ValueChanger.Program;
        this.Checked = val;
    }

    void OnButtonClickedByUser(Object sender, EventArgs e)
    {
        this.valueChanger = ValueChanger.User;
    }

    void OnCheckChange(Object sender, EventArgs e)
    {
        // do stuff depending on 'this.valueChanger'
    }


    enum ValueChanger
    {
        User,
        Program
    };
}

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

Моя проблема в том, что событие CheckedChanged срабатывает до события Click, что делает OnCheckChange ненадежным.

Есть ли способ исправить это?

1 Ответ

0 голосов
/ 29 мая 2018

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

И OnEnter, и ProcessMnemonic пытаются вызвать PerformClick, что вызывает OnClick, который отвечает за проверку управления.Таким образом, вы можете переопределить OnClick метод:

protected override void OnClick(EventArgs e) 
{
    // Here CheckedChanged event has not been raised yet

    base.OnClick(e);
}

Чтобы узнать больше о том, как RadioButton работает внутри, взгляните на его исходный код .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...