Every element defined in the toolbox comes from a skin file, this is a custom XML file that contains the frame definitions, property setup, and code that converts the properties to and from the Windows.Forms world. For example, the button definition looks like:
Code:
Buttonname="Button"inherits="UIPanelButtonTemplate"render="ComponentRender"frameid="{2D508884-59C2-4f83-AE10-27AAAD48391B}">
<!--
<FrameSkin>
<Setup>
<Property name="Location" visible="true" />
<Property name="Size" value="new System.Drawing.Size(100,22)" visible="true" />
<Property name="Text" visible="true" />
</Setup>
<Script>
<OnSetupFrame>
frame.Size = Dimension.FromSize(control.Size);
frame.Anchors.Clear();
frame.Anchors.Add(new LayoutFrame.Anchor());
frame.Anchors[0].point = FRAMEPOINT.TOPLEFT;
frame.Anchors[0].Offset = Dimension.FromPoint(control.Location);
frame.text = control.Text;
</OnSetupFrame>
<OnSetupForm>
control.Location = frame.Anchors[0].Offset.ToPoint();
control.Size = frame.Size.ToSize();
control.Text = frame.text;
</OnSetupForm>
</Script>
</FrameSkin>
-->
<Size>
<AbsDimension x="100" y="22"/>
</Size>
</Button>
As you can see, there is the basic XML definition, and code embedded in comments that allows you to add properties to the property viewer, and set those properties values in the XML definition for output, and then reimport them when loading back in. Initially all this was hard coded, but I think that this is alot more powerful, with no help from me, a skin author could create a tab control (although that may need custom designer support) or basically anything. This format does require familiarity with .NET, and there is a huge potential for misuse, but I like how it works so far.
Soon I will add the ability to add more skin files so that you can play with it.