将工具箱中的用户控件拖到Windows窗体上时,如何强制用户控件具有固定高度?

时间:2018-03-08 15:43:24

标签: vb.net winforms user-controls resize windows-forms-designer

我希望我新设计的用户控件具有一定的固定高度,正好在双击内部或从工具箱拖放到其父窗体上时。

现在,要么只是在用户控件设计师碰巧拥有的高度显示用户控件。

当使用组成用户控件启动应用程序时,UC将以所需高度显示,当停止应用程序时,它会保留该高度。这是由于以下代码:

Private Sub UTest_Load(sender As Object, e As EventArgs) _
    Handles MyBase.Load

    ...
    Me.Height = 20
    ...
End Sub

我需要在哪里初始化UC的高度,以便在从工具箱中拖动时立即应用它?

给UC的设计师一个初始固定高度是没有选择的:上面的20个像素只是一个例子,正确的高度是可变的并且基于计算。这些计算涉及ParentForm.Font。

1 个答案:

答案 0 :(得分:2)

听起来您希望在将用户控件放置在WinForm设计图面上时自动计算用户控件的大小。

将控件添加到设计器时,会设置其Site属性。此属性允许您访问System.ComponentModel.Design Namespace中定义的各种设计服务。使用IServiceProvider.GetService Method访问这些服务。 Site属性的类型为ISiteISite实现了IServiceProvider

感兴趣的服务是IDesignerHost服务,因为它允许您获取正在设计的根组件(Control)(在本例中为Form)。

以下是一种简单的方法来覆盖usercontrol的Site属性以获取对设计器服务的访问权。

Imports System.ComponentModel.Design

Public Class UCTest
   Public Overrides Property Site() As System.ComponentModel.ISite
      Get
         Return MyBase.Site
      End Get
      Set(ByVal value As System.ComponentModel.ISite)
         MyBase.Site = value
         If value IsNot Nothing Then SetDesignerSize()
      End Set
   End Property

   Private Sub SetDesignerSize()
      Dim host As IDesignerHost = DirectCast(Me.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
      If host IsNot Nothing Then
         ' host.RootComponent is typically the form but can be another design surface like a usercontrol
         Dim parent As Control = TryCast(host.RootComponent, Control)
         If parent IsNot Nothing Then
            Dim frm As Form = parent.FindForm
            If frm IsNot Nothing Then
               Me.Height = frm.Font.Height * 5
               Me.Width = frm.Font.Height * 10
            End If
         End If
      End If
   End Sub
End Class

编辑:回应评论寻求自定义控件设计时功能的学习资源。

通常情况下,我会告诉海报自己研究这些信息,但这些信息最多很难找到,而且我从来没有遇到过WinForm设计师功能的权威资源。

但是,这里有一些我发现有用的文章/博客文章。跟踪MS在不断变化的文档系统中的最终位置是一件痛苦的事。因此,我建议您制作一份您认为有用的任何内容的个人副本,因为链接可能会完全改变或消失。

Building Windows Forms Controls and Components with Rich Design-Time Features (by Michael Weinhardt and Chris Sells), MSDN Magazine April 2003 Download

Writing Custom Designers for .NET Components (by Shawn Burke)

Walkthrough: Creating a Windows Forms Control That Takes Advantage of Visual Studio Design-Time Features

Tailor Your Application by Building a Custom Forms Designer with .NET (by Sayed Y. Hashimi), MSDN Magazine December 2004 Download

Leverage Custom Controls (By Stephen Perry) - Part1

Leverage Custom Controls (By Stephen Perry) - Part2

How to: Access Design-Time Services

Walkthrough: Debugging Custom Windows Forms Controls at Design Time

最后一篇文章有​​一节"设置项目进行设计时调试"并且非常重要。对于许多设计时功能,您可以尝试在使用它们的项目中开发它们,但这样做有几个缺陷;其中最重要的是失去了正确的调试功能。

首先,您可能会使Visual Studio在某些时候变得不稳定。这可以通过在修改控件代码之前关闭所有活动设计表面并在修改后执行重新构建来最小化,但最终会变得很糟糕,您将不得不重新启动Visual Studio。

第二个也是更加隐蔽的问题是,我发现某些类型的设计器代码在原位开发时与推荐方法的工作方式不同。自定义TypeConverter将使用适当的技术完美运行,并在原位开发时失败。