问题 如何使C#的VS IDE设计器失效/刷新?

3
我有一个继承自Form的CustomForm,实现了一个名为Prop的布尔属性。我将使用的表单都将继承自CustomForm。如果启用此属性,它将对表单进行一些绘制和更改。然而,这个功能没有按照预期工作,VS IDE设计器没有刷新以显示更改。但是,如果我按下Ctrl+Shift+B(菜单:Build » Build Solution),则VS IDE将刷新,甚至表单设计器会在瞬间消失并重新绘制自己以应用新的更改。
那么,有没有办法通过代码强制VS IDE设计器刷新,就像我构建解决方案时发生的那样?如果可以的话,我可以将该代码添加到Prop set访问器中,我的问题就解决了。
请注意,我尝试调用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 { }

我只能在这个类中声明属性,而不能在Form类中声明... 我也使用了Invalidate(),但它并没有解决我的问题。

3个回答

4

有其他人帮我解决了问题。当用户将EnableSkin设置为false时,我只需调用ReCreateHandle()函数即可解决问题 :)

不过还是要感谢大家的帮助 :)


对我也起作用了,但是 [Description("Description of your property."), NotifyParentProperty(true), RefreshProperties(RefreshProperties.Repaint)] 完全没有起作用,甚至一个简单的刷新都不行。 - Hassan Faghihi

2
你只需要在属性中添加这个属性即可:
 [Description("Description of your property."), NotifyParentProperty(true),
 RefreshProperties(RefreshProperties.Repaint)]

当值变化时,这将导致IDE重新绘制。


根据MSDN文档,该属性并不能实现我想要的功能:“指示在关联的属性值更改时属性网格应刷新。”它将刷新属性网格,而不是IDE设计器。 - rfgamaral

0
据我所知,如果您正在显示进行绘画的对象,则绘画例程不会反映在IDE中。例如,如果您的基本窗体进行一些绘画,则继承的窗体会显示该结果...但是如果您打开基本窗体,则不会显示绘画结果。
我认为,如果您需要查看更改子窗体属性的结果,则应在基本窗体中声明属性,并在该窗体中进行绘画。
顺便说一句,在属性体中,您应调用this.Invalidate()以刷新绘画。
希望能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接