【问题标题】:Windows Forms Custom Design PropertiesWindows 窗体自定义设计属性
【发布时间】:2011-09-03 10:22:51
【问题描述】:

这是一个困扰我好几年的问题。

我们在项目中使用派生的 Windows 窗体组件和控件。比如我们派生自Button、UserControl等

我们的派生按钮上有一些自定义属性。例如,它有一个名为 Severity 的枚举属性。此属性的设置器查看枚举值并在基本 Button 上设置一些内容,例如文本颜色和边框等。

这很好用...但是我们的用户控件将这个按钮放在他们的设计器上并在属性窗口中设置严重性的值最终实际上将严重性属性在设置器中执行的代码写入用户控件的按钮本身.

我们不希望这样...它违背了拥有共享 Severity 属性的目的,因为我们不能再更改 Severity 的实现并且它不会全局应用更改,因为用户控件自己设置了严重性属性以及它被拖到控件上时包含的代码...

我尝试添加诸如 DesignerSerializationVisiblity 之类的属性,但这似乎从来没有达到预期的效果。

如何防止 Windows 窗体设计器在 Severity 属性的实现内部生成代码?

谢谢。

【问题讨论】:

    标签: .net winforms windows-forms-designer


    【解决方案1】:

    我在 WinForms 中遇到过类似的问题,即表单在设计器中运行代码。为了解决这个问题,我创建了一个静态方法来检查 Visual Studio 是否是宿主进程,并将其包装在设计人员应该忽略的代码周围。

    VB.Net

    Imports System.Diagnostics
    
    Public Shared Function IsVisualStudioHostProcess() As Boolean
        Return (Process.GetCurrentProcess().ProcessName.ToUpper() = "DEVENV")
    End Function
    
    Public Sub MethodName()
        If Not (IsVisualStudioHostProcess()) Then
            ' Code here
        End If
    End Sub
    

    C#

    Using System.Diagnostics;
    
    public static bool IsVisualStudioHostProcess()
    {
        return (Process.GetCurrentProcess().ProcessName.ToUpper() == "DEVENV");
    }
    
    public void MethodName()
    {
        if (!IsVisualStudioHostProcess())
        {
            // Code Here
        }
    }
    

    【讨论】:

    • 不错!我在其他地方使用相同的方法...但是有更清洁(即更受支持)的方法吗?
    • 另外,这不会阻止更改在设计器中可见吗?
    猜你喜欢
    • 2011-05-28
    • 2014-11-14
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多