Confessions of a Dangerous Mind

Brain.FlushBuffer()
posts - 176, comments - 234, trackbacks - 93

Scrivere un control class converter per VB6(2)XAML

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"/>

Print | posted on mercoledì 29 novembre 2006 18:05 | Filed Under [ Tutorials ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET