【问题标题】:How can I use Visual Studio designer without form如何在没有表单的情况下使用 Visual Studio 设计器
【发布时间】:2015-02-22 21:22:05
【问题描述】:

我正在使用 Visual Studio 创建一个 Windows 窗体项目。

我的项目的解决方案资源管理器中没有表单类 - 我即时构建所有表单。所以我没有机会在 Visual Studio 或工具箱中打开设计器。

但我想创建一个 ContextMenuStrip 并在设计器中对其进行编辑。我通常通过将 ContextMenuStrip 从 ToolBox 拖到 Designer 上来做到这一点。但是,如果不先创建表单或用户控件,我没有任何方法(我可以说)打开设计器。

如何在设计器中编辑 ContextMenuStrip 而无需先将其与表单或用户控件相关联?

需要明确 - 我知道如何在代码中动态生成 ContextMenuStrip。那不是我想要的。我想使用设计器来创建和编辑 ContextMenuStrip,而不必先将 ContextMenuStrip 与我不会包含在我的项目中的表单或用户控件相关联。

(Visual Studio 2013 Pro,如果重要的话)

【问题讨论】:

  • 我不太清楚你的意思 - 但也许 property grid control 会做你想做的事
  • 你不能,你需要一个表单或用户控件。
  • @LasseV.Karlsen - 所以...我在 VS 中创建了一个用户控件,并在设计器中为该控件添加了一个上下文菜单,然后对其进行编辑;然后在我的“即时构建表单”代码中,我实例化用户控件,不要将用户控件添加到表单中,然后将 form.ContextMenuStrip 设置为 myUserControl.ContextMenuStrip?
  • 我不能说这是否行得通,我只能说 Visual Studio 中的设计器不是为设计独立控件或组件而设计的,它是为设计表单和用户控件而设计的。我无法告诉您,您是否可以使用未添加到表单的用户控件中的 contextmenustrip,您只需要进行试验即可。
  • @GrantWinney - 表单是我动态创建的窗口,上面有一个用户控件 - 一个绘图表面。这就是为什么它们不作为预制类存在的原因。同时 - 单独 - ContextMenuStrip 是 Decorator 类的一部分,各种消费者添加到绘图控件中,以在不同时间为其提供不同的功能。 Decorator 类中没有用户控件,因此除了运行时代码之外无法提供 ContextMenuStrip。

标签: c# winforms visual-studio


【解决方案1】:

我不相信这是可能的,而且我认为在审查下它真的没有意义。

Designer 是帮助您构建表单和用户控件的工具。就是这样。它可以节省您编写代码以手动创建和绘制控件。它提供了快捷方式和漂亮的图形视图,说明本质上是自动代码生成。

您尝试创建的既不是新的 UserControl 类型,也不是新的 Form 类型 - 两者都可以在 Designer 中创建。这是一个预先添加了某些内容的菜单条。这不能孤立存在。它需要转换为创建成员并将成员添加到具体ContextMenuStrip 对象的代码。该对象必须存在于某个类中(FormUserControl)。我看不出它怎么会单独存在。

【讨论】:

  • “我认为这在仔细审查下是没有意义的。” -- 怀疑我提供的设计器是否能够帮助我以图形方式编辑我在代码中声明的已知数据结构是没有意义的?我可以理解为什么建设者会选择不支持这一点,但我几乎不认为这种愿望“没有意义”。我看到这个问题也被否决了,这也超出了我的范围。如果这是一个不止一个 VS 用户可能会问的问题,那么这对 Stackoverflow 有何用处?呃,好吧。 Stackoveflow 的奥秘仍在继续。
  • 我认为这是一个非常合理的问题——事实上,我赞成它。我所说的“没有意义”是指“不符合设计师的工作方式”。如果我的回答有任何冒犯性,我深表歉意。
【解决方案2】:

同样的问题...新的解决方案...

  1. 创建一个用户控件(例如 UC1)
  2. 将 ContextMenu 作为 CC1 添加到 UC1 并在那里设计/编辑它
  3. 将 UserControl 添加到您的项目中(或通过代码创建)
  4. 请参阅 UC1.CC1 了解您现在的“非常有用”的 ContextMenu

【讨论】:

  • 应该可以,但是您必须将 CC1 的修饰符属性更改为 public 才能看到它...
【解决方案3】:

您可以将 ContextMenuStrip 添加到表单,然后使用代码修改表单,以便使用单例类型属性访问它:

public partial class frmContextMenuHost : Form
{

    private frmContextMenuHost()
    {
        InitializeComponent();
    }

    private static frmContextMenuHost _frmContextMenu = null;

    public static ContextMenuStrip GetContextMenu
    {
        get
        {
            if (_frmContextMenu == null)
            {
                _frmContextMenu = new frmContextMenuHost();
            }
            return _frmContextMenu.contextMenuStrip1;
        }
    }

}

您打算如何使用 ContextMenuStrip 的事件?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2020-03-30
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多