拥有带有Label的UserControl,自制“TextBox”(直接从Control继承)和Button。 目标是将标签“粘合”到相关控件上,因此表单的设计更直接。 我重写了OnPaint()事件,因此考虑到标签的宽度来计算“TextBox”的含量。反过来,它的文本取自UserControl的可设计属性。这样,UserControl的全宽就是设计器中的内容。 所有计算都正确完成(当标签的文本较大时,文本宽度较小,反之亦然......)。再说一遍:如果标签文本为空,则标签被标记为不可见,等等。 但标签没有显示。 一些想法? TIA
答案 0 :(得分:1)
我遵循了壳牌的建议。但有一点扭曲。 如果从UserControl OnPaint事件尝试DrawString(),则会发生nohing,因为窗体的OnPaint在所有控件之后被触发,因此它会清除文本。 我使用的是在Form中创建一个方法,其中包含UserControl并将其设置为接口。一些代码如下
接口和辅助类
public interface IKindForm
{
void DisplayText( DisplayText t );
}
public class DisplayText
{
public string Text { get; protected set; }
public Font Font { get; protected set; }
public Brush Brush { get; protected set; }
public Point Point { get; protected set; }
public DisplayText( string text, Font font, Color color, int x, int y )
{
Text = text;
Font = font;
Brush = new SolidBrush( color );
Point = new Point( x, y );
}
}
实现接口和覆盖的OnPaint
的形式的方法 private List<DisplayText> textsToDisplay = new List<DisplayText>();
public void DisplayText( DisplayText t )
{
if (textsToDisplay.Contains( t ))
return;
textsToDisplay.Add( t );
Invalidate();
}
protected override void OnPaint( PaintEventArgs e )
{
foreach (DisplayText t in textsToDisplay)
e.Graphics.DrawString( t.Text, t.Font, t.Brush, t.Point );
base.OnPaint( e );
}
最后,UserControl中的代码
bool labelRegistered = false;
protected override void OnPaint( PaintEventArgs e )
{
int textStart = 0;
SizeF ssize = new SizeF( 0, 0 );
if (labelText != null && labelText != String.Empty) {
ssize = e.Graphics.MeasureString( labelText, labelFont );
textStart = (int)ssize.Width;
}
if (ssize.Width > 0) {
if (this.TopLevelControl is IKindForm) {
if (!labelRegistered) {
int yPos = this.Location.Y + margin + ComboText.Size.Height / 4;
int xPos = this.Location.X - ( textStart + labelOffset );
((IKindForm)this.TopLevelControl).DisplayText( new DisplayText( labelText, LabelFont, labelColor,
xPos, yPos ) );
}
}
labelRegistered = true;
}
唯一的缺点是,在设计器中,TopLevelControl不是IKindForm,因此您无法看到“标签”。
答案 1 :(得分:0)
您无法在文本框继承的用户控件中添加标签。您必须将控件(标签和文本框)分别放在用户控件上而不是继承。因此,您可以以编程方式设置文本框的大小和位置。并且您必须创建要在类或命名空间之外处理的所有属性。
例如
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Browsable(true)]
[DefaultValue(string.Empty)]
public override string Text
{
get {
return txtBox.Text;
}
set {
txtBox.Text = value;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Browsable(true)]
[DefaultValue("My Lable:")]
public string LabelText
{
get{
return lblLabel.Text;
}
Set {
lblLabel.Text = value;
}
}