我希望我新设计的用户控件具有一定的固定高度,正好在双击内部或从工具箱拖放到其父窗体上时。
现在,要么只是在用户控件设计师碰巧拥有的高度显示用户控件。
当使用组成用户控件启动应用程序时,UC将以所需高度显示,当停止应用程序时,它会保留该高度。这是由于以下代码:
Private Sub UTest_Load(sender As Object, e As EventArgs) _
Handles MyBase.Load
...
Me.Height = 20
...
End Sub
我需要在哪里初始化UC的高度,以便在从工具箱中拖动时立即应用它?
给UC的设计师一个初始固定高度是没有选择的:上面的20个像素只是一个例子,正确的高度是可变的并且基于计算。这些计算涉及ParentForm.Font。
答案 0 :(得分:2)
听起来您希望在将用户控件放置在WinForm设计图面上时自动计算用户控件的大小。
将控件添加到设计器时,会设置其Site
属性。此属性允许您访问System.ComponentModel.Design Namespace中定义的各种设计服务。使用IServiceProvider.GetService Method访问这些服务。 Site
属性的类型为ISite
,ISite
实现了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在不断变化的文档系统中的最终位置是一件痛苦的事。因此,我建议您制作一份您认为有用的任何内容的个人副本,因为链接可能会完全改变或消失。
Writing Custom Designers for .NET Components (by Shawn Burke)
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将使用适当的技术完美运行,并在原位开发时失败。