C # Window Forms Control Стили, Удалить фокус с помощью изменения стиля - PullRequest
1 голос
/ 02 декабря 2011

У меня есть дочерняя форма, которую я загружаю из родительской формы.Родительская форма НЕ является родителем MDI.Я хотел бы сделать следующее:

Я хотел бы отключить пунктирный / пунктирный прямоугольник вокруг элементов управления, которые имеют фокус, в частности кнопки и радиокнопки.

В настоящее время я использую следующий код:

foreach (System.Windows.Forms.Control control in this.Controls)
{
    // Prevent button(s) and RadioButtons getting focus
    if (control is Button | control is RadioButton)
    {
        HelperFunctions.SetStyle(control, ControlStyles.Selectable, false);
    }
}

где мой метод SetStyle -

public static void SetStyle(System.Windows.Forms.Control control, ControlStyles styles,
    bool newValue)
{
    // .. set control styles for the form
    object[] args = { styles, newValue };

    typeof(System.Windows.Forms.Control).InvokeMember("SetStyle",
        BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod,
        null, control, args);
}

Излишне говорить, что это не похоже на работу.Я не уверен, что мне здесь не хватает.Будем весьма благодарны за любые предложения и / или советы.

1 Ответ

2 голосов
/ 03 декабря 2011

Ну, я думаю, что нашел какое-то решение. Решение устраняет проблему с прямоугольником фокуса, но не отвечает на вопрос о том, что не так с опубликованным исходным кодом. Это мое понимание вопроса о прямоугольнике ... пожалуйста, не стесняйтесь поправлять меня, если я что-то неправильно понял.

Может показаться, что существует два типа пунктирных / пунктирных прямоугольников: прямоугольники, которые указывают, что элемент управления сфокусирован, и прямоугольники, которые указывают, что элемент управления является элементом управления по умолчанию. Обе эти ситуации требуют создания пользовательского класса для элемента управления. В моем случае интересующим элементом управления была RadioButton. Итак, вот код:

public class NoFocusRadioButton: RadioButton
{
    // ---> If you DO NOT want to allow focus to the control, and want to get rid of
    // the default focus rectangle around the control, use the following ...

    // ... constructor
    public NoFocusRadioButton()
    {
        // ... removes the focus rectangle surrounding active/focused radio buttons
       this.SetStyle(ControlStyles.Selectable, false);
    }
}

или используйте следующее:

public class NoFocusRadioButton: RadioButton
{
    // ---> If you DO want to allow focus to the control, and want to get rid of the
    // default focus rectangle around the control, use the following ...

    protected override bool ShowFocusCues
    {
        get
        {
            return false;
        }
    }
}

Я использую первый (код конструктора) подход, чтобы не допустить фокус ввода.

Все это прекрасно работает для решения проблемы прямоугольника, но я до сих пор не понимаю, почему исходный код не работал.

...