Вопрос Как сделать недействительным / обновить конструктор VS IDE для C #? - PullRequest
3 голосов
/ 25 ноября 2008

У меня CustomForm унаследовано от Форма , которая реализует логическое свойство с именем Prop . Формы, которые я буду использовать, будут наследоваться от CustomForm . Это свойство будет рисовать и вносить изменения (если оно включено) в форму. Однако это не работает должным образом, разработанная VS IDE не обновляется для отображения изменений. Но если я нажму Ctrl + Shift + B (Меню: Построить »> Построить решение), VS IDE обновится, дизайнер форм даже исчезнет на долю секунды и перерисовает себя с примененными новыми изменениями.

Итак, есть ли способ, с помощью кода, заставить конструктор VS IDE обновляться, как это происходит при создании решения? Если так, я мог бы добавить этот код в набор доступа Prop , и моя проблема исчезла.

Обратите внимание, что я пытался вызвать Invalidate (), Refresh () и Update. Но никто из них, похоже, не решил проблему ...


Вот немного понимания моей настоящей проблемы. Мой код выглядит примерно так:

internal class MyForm : Form {
    private FormBorderStyle formBorderStyle;
    private bool enableSkin;

    [DefaultValue(false)]
    public bool EnableSkin {
        get {
                return enableSkin;
        } set {
                enableSkin = value;

                if(enableSkin) {
                        BackColor = Color.Lime;
                        MaximizedBounds = Screen.GetWorkingArea(this);
                        TransparencyKey = Color.Lime;

                        base.FormBorderStyle = FormBorderStyle.None;
                } else {
                        BackColor = SystemColors.Control;
                        MaximizedBounds = Rectangle.Empty;
                        TransparencyKey = Color.Empty;

                        base.FormBorderStyle = FormBorderStyle;
                }
        }
    }

    [DefaultValue(FormBorderStyle.Sizable)]
    public new FormBorderStyle FormBorderStyle {
        get {
                return formBorderStyle;
        } set {
                formBorderStyle = value;

                if(EnableSkin) {
                        base.FormBorderStyle = FormBorderStyle.None;
                } else {
                        base.FormBorderStyle = formBorderStyle;
                }

        }
    }

    internal MyForm() {
        EnableSkin = false;
        FormBorderStyle = FormBorderStyle.Sizable;
    }
}

А у меня проблема примерно такая: http://blogs.msdn.com/calvin_hsia/archive/2007/05/01/windows-vista-aero-borderstyle-paint-problem-as-non-administrator.aspx

В моем случае это происходит, когда вы устанавливаете EnableSkin в True, меняете его обратно на False, а затем изменение FormBorderStyle вызовет проблему, которую вы можете увидеть по ссылке выше. Как указано в статье, проблема не возникает при запуске VS от имени администратора.

Вот почему я ищу способ обновить конструктор VS IDE. Другими словами, теперь, когда я нашел эту статью, мне нужно заново создать окно, как это происходит при перестроении решения.


Как объявить свойство в базовой форме?

В настоящее время у меня есть:

public class MyForm : Form { }

И я могу объявить свойства только внутри этого класса, но не внутри Формы 1. Я также использовал Invalidate (), как я говорил в первом посте, но это не решает мою проблему.

Ответы [ 3 ]

4 голосов
/ 25 ноября 2008

Кто-то еще помог мне и решил проблему. Я просто вызываю ReCreateHandle () , когда пользователь устанавливает EnableSkin в значение false. Проблема решена:)

Спасибо всем, хотя:)

2 голосов
/ 25 ноября 2008

Все, что вам нужно сделать, это добавить этот атрибут в вашу собственность:

 [Description("Description of your property."), NotifyParentProperty(true),
 RefreshProperties(RefreshProperties.Repaint)]

Это приведет к перекрашиванию среды IDE при изменении значения.

0 голосов
/ 25 ноября 2008

Насколько я знаю, процедуры рисования не отражаются в IDE, если вы показываете объект, который рисует. Например, если ваша базовая форма выполняет рисование, унаследованный показывает, что ... но если вы откроете базовую форму, она не покажет результат рисования.

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

Кстати ... в теле свойства вы должны позвонить this.Invalidate(), чтобы обновить картину.

Надеюсь, это поможет!

...