U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Voorbeelden van customizers die XAML-schermen aanpassen

0000002838     -      14-08-2018

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;
        }
    }
}