Per tutti coloro i quali sono interessati all'utilizzo ed alla personalizzazione del tools VB6(2)XAML, pubblico un esempio di come possa essere possibile ridefinire il rendering dell'elemento VB.Label con una classe proprietaria. Dopo aver creato un progetto di tipo ClassLibrary, possiamo aggiungere la referenza a VB62XAML.exe nella quale si trova la classe VBControl, dalla quale dovremo ereditare.
Implementando un override del metodo RenderToWPF possiamo definire come renderizzare il nostro controllo Label. Nell'esempio che ho riportato sotto, è possibile osservare una tecnica basata sulla creazione "manuale" degli elementi, ed un'altra basata sull'utilizzo di templates che magari possono essere caricati da disco.
Imports System.Xml
Imports CodeSapiens.VB62XAML
Public Class MyLabel
Inherits CodeSapiens.VB62XAML.VBControl
''' <summary>
''' Override base function RenderToWPF and replace with new rendering attributes
''' </summary>
''' <param name="document">The XML document that parser passes to classes</param>
''' <returns>XMLElement representing the control in XML Format</returns>
''' <remarks></remarks>
Public Overrides Function RenderToWPF(ByVal document As System.Xml.XmlDocument) As System.Xml.XmlElement
'Create element
Dim _item As XmlElement = document.CreateElement("Label")
'Set base positioning attributes
_item.SetAttribute("Name", Helpers.BuildName(Me.Name, Me.Properties))
_item.SetAttribute("Canvas.Left", Helpers.TwipsToPixels(Convert.ToInt32(Me.Properties.GetProperty("Left").Value)))
_item.SetAttribute("Canvas.Top", Helpers.TwipsToPixels(Convert.ToInt32(Me.Properties.GetProperty("Top").Value)))
_item.SetAttribute("Width", Helpers.TwipsToPixels(Convert.ToInt32(Me.Properties.GetProperty("Width").Value)))
_item.SetAttribute("Height", Helpers.TwipsToPixels(Convert.ToInt32(Me.Properties.GetProperty("Height").Value)))
_item.SetAttribute("Content", Me.Properties.GetProperty("Caption").Value)
_item.SetAttribute("Padding", "0,0,0,0")
'Create a document fragment to show another manner of embedding XML in Control Rendering
Dim _docFrag As XmlDocumentFragment = document.CreateDocumentFragment()
Dim _gradientTemplate As String = String.Empty
' This string could be loaded from disk, and maybe values could be placeholders
' so we can substitute them at run-time using our special values...
_gradientTemplate = "<Label.Background>" & _
" <LinearGradientBrush StartPoint=""0.5,0"" EndPoint=""0.5,1"">" & _
" <GradientStop Offset=""0.0"" Color=""LightBlue""/>" & _
" <GradientStop Offset=""1.0"" Color=""SlateBlue""/>" & _
" </LinearGradientBrush>" & _
"</Label.Background>"
_docFrag.InnerXml = _gradientTemplate
_item.AppendChild(_docFrag)
'Handle font generation
If Me.Properties.ContainsProperty("Font") Then
Me.RenderFont(Me.Properties.GetProperty("Font"), _item)
End If
Return _item
End Function
End Class
Uno dei punti fondamentali, comunque, è rappresentato dalla "dichiarazione" fatta nel file .config dell'applicazione, del class converter che utilizzerà il controllo Label:
<!--<add key="VB.Label" value="VB62XAML, CodeSapiens.VB62XAML.VBLabel"/>-->
<add key="VB.Label" value="CustomControls, CustomControls.MyLabel"/>