Labels or  LinkLabels. It would be very handy if we could override the designer behaviour so that all alignment was done based on the properties of the label contained within the control.To this end I created a new
ControlDesigner that creates a local LabelDesigner and passes its snap lines out to Visual Studio. My experiment works if the label contained in the user control is at position (0,0). Some work changes might be necessary to make this work if the label has a different position.using System;
using System.Collections;
using System.ComponentModel;
using System.Reflection;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace WrappedLabel
{
    public interface ICustomSnapLineControl
    {
        Label GetSnapLineLabel();
    }
    public class CustomSnapLineControlDesigner : ControlDesigner
    {
        private ControlDesigner labelDesigner;
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            if (component is ICustomSnapLineControl)
            {
                var designAssembly = Assembly.Load("System.Design");
                var type = designAssembly.GetType("System.Windows.Forms.Design.LabelDesigner");
                labelDesigner = (ControlDesigner)Activator.CreateInstance(type); 
                labelDesigner.Initialize(((ICustomSnapLineControl)component).GetSnapLineLabel());
            }
        }
        public override IList SnapLines
        {
            get
            {
                return labelDesigner != null ? labelDesigner.SnapLines : base.SnapLines;
            }
        }
    }
}Designer attribute to your user control and implement the ICustomSnapLineControl interface. Here is a simple example.using System.ComponentModel;
using System.Windows.Forms;
namespace WrappedLabel
{
    [Designer(typeof(CustomSnapLineControlDesigner))]
    public partial class NewLabel : UserControl, ICustomSnapLineControl
    {
        public NewLabel()
        {
            InitializeComponent();
        }
        public override string Text
        {
            get
            {
                return label1.Text;
            }
            set
            {
                label1.Text = value;
            }
        }
        public Label GetSnapLineLabel()
        {
            return label1;
        }
    }
} 
No comments:
Post a Comment