Voorbeelden van customizers die XAML-schermen aanpassen

0000002838     -      13-12-2022

De MercatorPenguin-schermen voor het bewerken van gegevens laten slechts één XAML-instelling per gebruikerstaal toe. 
In sommige gevallen kan het nodig zijn om rekening te houden met de taal van de gebruiker om te bepalen in welke 
taal het scherm weergegeven moet worden.

Het is mogelijk om op de XAML-code te reageren via de customizer die gekoppeld is aan het element dat bewerkt wordt binnen MercatorPenguin.

Het voorbeeld hieronder illustreert enkele voorbeelden voor een artikelfiche. De customizer is van het type SigStock. Het implementeert de interface MercatorUi.ICustomizers.IXmlDocumentUpdaterWithContextInfo.
Het ContextObject zal van het volgende type zijn:

  • voor een informatiebestand: MercatorUi.Sig.Tools.SigRecordDescriptor
  • voor een actie: MercatorUi.Engine.Crm.Tools.ActionDescriptor
  • voor een document uit het commercieel beheer: MercatorUi.Engine.Gescom.Tools.BillingDocDescriptor.

Merk op dat de methode xmlDocument.FindNodesRecursive deel uitmaakt van MercatorExtensions.:

using MercatorExtensions;

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Xml;

namespace SigStock
{
    public class Customizer : MercatorUi.ICustomizers.IXmlDocumentUpdaterWithContextInfo
    {

        public void XmlDocumentUpdateWithContextInfo(XmlDocument xmlDocument, object contextInfo)
        {
            if (Globals.IsMercatorPenguinServer)
            {
                MercatorUi.Sig.Tools.SigRecordDescriptor sigRecordDescriptor = (MercatorUi.Sig.Tools.SigRecordDescriptor)contextInfo;

                // Een element verwijderen
                XmlNode node = xmlDocument.FindNodesRecursive(n => (n.Name == "m:EditPicker") && (n.Attributes["Source"].Value == "s_modeled")).FirstOrDefault();
                if (node != null)
                    node.ParentNode.RemoveChild(node);

                // De kleur van een element wijzigen
                node = xmlDocument.FindNodesRecursive(n => (n.Name == "m:EditEntry") && (n.Attributes["Source"].Value == "s_cle1")).FirstOrDefault();
                if (node != null)
                {
                    XmlAttribute attr = xmlDocument.CreateAttribute("BackgroundColor");
                    attr.Value = "Red";
                    node.Attributes.SetNamedItem(attr);
                }

                // Een element uitschakelen
                node = xmlDocument.FindNodesRecursive(n => (n.Name == "m:EditEntry") && (n.Attributes["Source"].Value == "s_cle2")).FirstOrDefault();
                if (node != null)
                {
                    XmlAttribute attr = xmlDocument.CreateAttribute("IsEnabled");
                    attr.Value = "false";
                    node.Attributes.SetNamedItem(attr);
                }

                // Een element onzichtbaar maken
                node = xmlDocument.FindNodesRecursive(n => (n.Name == "m:EditEntry") && (n.Attributes["Source"].Value == "s_cle3")).FirstOrDefault();
                if (node != null)
                {
                    XmlAttribute attr = xmlDocument.CreateAttribute("IsVisible");
                    attr.Value = "false";
                    node.Attributes.SetNamedItem(attr);
                }
            }
        }
    }
}

 

Deze code toont hoe u eenvoudig kan inspelen op bestaande XAML-code. Het is ook mogelijk om XAML-inhoud programmatisch toe te voegen via de customizer. In het geval van een informatiebestand, indien u een EditEntry-control met bron wilt toevoegen is het noodzakelijk om de interfaces MercatorUi.ICustomizers.IStringUpdater  of MercatorUi.ICustomizers.IStringUpdaterWithContextInfo te implementeren. Omwille van de optimalisatie selecteert MercatorPenguinServer alleen de kolommen die zich in de XAML-code bevinden, voordat deze door de customizer gewijzigd worden.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Xml;

namespace SigStock
{
    public class Customizer : MercatorUi.ICustomizers.IXmlDocumentUpdaterWithContextInfo, MercatorUi.ICustomizers.IStringUpdaterWithContextInfo
    {

        public void XmlDocumentUpdateWithContextInfo(XmlDocument xmlDocument, object contextInfo)
        {
            if (Globals.IsMercatorPenguinServer)
            {
                // De standaard stackLayout zoeken
                XmlNode parentStackLayout = xmlDocument.FindNodesRecursive(n => (n.Name == "StackLayout")).First();

                //Een horizontale stacklayout definiëren
                XmlNode newStackLayout = xmlDocument.CreateNode(XmlNodeType.Element, "StackLayout", null);
                parentStackLayout.AppendChild(newStackLayout);
                XmlAttribute attrHorizontal = xmlDocument.CreateAttribute("Orientation");
                attrHorizontal.Value = "Horizontal";
                newStackLayout.Attributes.SetNamedItem(attrHorizontal);

                // een nieuw Label definiëren en toevoegen aan de StackLayout
                XmlNode label = xmlDocument.CreateNode(XmlNodeType.Element, "Label", null);
                XmlAttribute attrText = xmlDocument.CreateAttribute("Text");
                attrText.Value = "NL :";
                label.Attributes.SetNamedItem(attrText);
                XmlAttribute attrFont = xmlDocument.CreateAttribute("Font");
                attrFont.Value = "Medium";
                label.Attributes.SetNamedItem(attrFont);
                XmlAttribute attrMargin = xmlDocument.CreateAttribute("Margin");
                attrMargin.Value = "10,5,25,0";
                label.Attributes.SetNamedItem(attrMargin);
                XmlAttribute attrVerticalOptions = xmlDocument.CreateAttribute("VerticalOptions");
                attrVerticalOptions.Value = "Center";
                label.Attributes.SetNamedItem(attrVerticalOptions);
                newStackLayout.AppendChild(label);

                // een nieuwe EditEntry definiëren en toevoegen aan de StackLayout
                XmlNode entry = xmlDocument.CreateNode(XmlNodeType.Element, "m", "EditEntry", "clr-namespace:MercatorPenguin.Controls.Edit;assembly=MercatorPenguin.dll");
                XmlAttribute attrSource = xmlDocument.CreateAttribute("Source");
                attrSource.Value = "s_modelen";
                entry.Attributes.SetNamedItem(attrSource);
                XmlAttribute attrHorizontalOptions = xmlDocument.CreateAttribute("HorizontalOptions");
                attrHorizontalOptions.Value = "FillAndExpand";
                entry.Attributes.SetNamedItem(attrHorizontalOptions);
                MercatorUi.Sig.Sig sigStock = MercatorUi.Sig._SigsStatic.SigByModule(MercatorUi.Sig._SigEnum.STOCK);
                XmlAttribute attrMaxLength = xmlDocument.CreateAttribute("MaxLength");
                attrMaxLength.Value = sigStock.FieldList["S_MODELEN"].Length.ToString();
                entry.Attributes.SetNamedItem(attrMaxLength);
                newStackLayout.AppendChild(entry);
            }
        }

        public string StringUpdate(string s, object contextInfo)
        {
            if (Globals.IsMercatorPenguinServer)
            {
                MercatorUi.Sig.Tools.SigRecordDescriptor sigRecordDescriptor = (MercatorUi.Sig.Tools.SigRecordDescriptor)contextInfo;
                s = s.Replace(" from ", ",s_modelen from ");
            }
            return s;
        }
    }
}

Sinds versie 2.10.17 van MercatorPenguinServer is het ook mogelijk om op de Xaml-code van de ListViewCell van wizigbare documenten te werken (2de tabblad).

Als een ListViewCell bijvoorbeeld deze XAML-code bevat

<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">  
<Label Text="Q=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@Q:### ##0.00" FontSize="12" Margin="0,0,25,0" />
<Label Text="PU=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@PU:### ##0.00" FontSize="12" Margin="0,0,25,0" />
<Label Text="%=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@REMISE:##0.00" FontSize="12" Margin="0,0,25,0" HorizontalOptions="FillAndExpand" />
</StackLayout>

het zal mogelijk zijn om de korting voorwaardelijk te verbergen met deze customizer:

Zoom
public void XmlDocumentUpdateWithContextInfo(XmlDocument xmlDocument, object contextInfo)
{
    if (Globals.IsMercatorPenguinServer && (Globals.CurrentUserRecord...))
    {
        XmlNode node = xmlDocument.FindNodesRecursive(n => (n.Name == "Label") && (n.Attributes["Text"].Value == "@REMISE:##0.00")).FirstOrDefault();
        if (node != null)
            node.ParentNode.RemoveChild(node);
        node = xmlDocument.FindNodesRecursive(n => (n.Name == "Label") && (n.Attributes["Text"].Value == "%=")).FirstOrDefault();
        if (node != null)
            node.ParentNode.RemoveChild(node);
    }
}

 

Technische informatie : in het XmlDocument doorgegeven aan XmlDocumentUpdateWithContextInfo, wordt een XamlListViewCell node aan het ContentPage node toegevoegd. Het bevat de XAML code van de ListViewCell.