andrewducker: (Default)
andrewducker ([personal profile] andrewducker) wrote2007-03-22 05:54 pm

Snaplines on Custom Controls

Note - originally written for our internal .Net discussion forum. I wanted to archive it somewhere public so that I could find it again later. Because frankly the MS documentation sucks ass.

====

You may have noticed that when you create a custom usercontrol it doesn't come with a "text" snapline. Which makes it very hard to align labels, etc. to it using the IDE.

There is a simple way to do so, but if it's documented anywhere by MS then I'm darned if I could find it. I did eventually track down a way of doing so, which worked for me without any problems.

If you create a usercontrol called "MyUserControl", then you need to go into its code and add a designer attribute above the class declaration like so:

[Designer(typeof(SnaplineControlDesigner))]
public partial class MyUserControl1 : UserControl
{
   public MyUserControl1()
   {
      InitializeComponent();
   }
}

You'll then need to create a SnaplineControlDesigner that looks like this:
public class SnaplineControlDesigner : ControlDesigner
{
   public override IList SnapLines
   {
      get
      {
         Control control = this.Component as Control;
         ArrayList snapLines = base.SnapLines as ArrayList;
         snapLines.Add(
         new SnapLine(SnapLineType.Baseline, control.Height - 4, SnapLinePriority.Medium));
         return snapLines;
      }
   }
}

Which, as you can see, uses its pointer to the original control to get the control's height and then place the snapline 4 pixels up. Obviously, if you want it to be 5,7 or 23 pixels up, then you can simply change that.