Erweiterte Programmierung


iPlus-Steuerelemente sind vorwiegend Erweiterungen der Microsoft WPF-Steuerelemente.  Sie vereinfachen die Oberflächenprogrammierung, indem der komplizierte Binding-Mechanismus für Sie verborgen wird. Weitere Gründe und Vorteile entnehmen Sie dem Kapitel GUI Design.


Mit dem Steuerelement VBDockingManager können Sie Ihre Designs in andockbaren Fenstern anzeigen:

 

Ein anzuzeigendes Design kann sich in einem der vier Zustände befinden, das mit den enum "Global.VBDesignDockState" beschrieben wird:

  • AutoHideButton: Versteckt als Button an einem der vier Seiten,
  • Docked: angedockt an einem der vier Seiten,
  • Tabbed: als Registerkarte,
  • FloatingWindow: als Fenster, das frei verschoben werden kann.

Die Orientierung des Docked- oder AutoHideButton Zustands steuern Sie mit dem enum "Global.VBDesignDockPosition":

  • Left,
  • Top,
  • Right,
  • Bottom

Diese Eigenschaften setzen Sie im XAML-Code als Attached-Properties in VBDesigns. Der Dockingmanager selbst besitzt die Content-Property VBDesignList, die eine Liste von VBDesigns ist.

<vb:VBDockingManager xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:vb="http://www.iplus-framework.com/ACFramework/xaml"
FocusView="{Binding MyFocusView}"> 

<vb:VBDesign VBContent="*InOrderForm" 
vb:VBDockingManager.Container="TabItem" 
vb:VBDockingManager.DockState="Tabbed" 
vb:VBDockingManager.DockPosition="Bottom" 
vb:VBDockingManager.IsCloseableBSORoot="False
vb:VBDockingManager.RibbonBarVisibility
="Hidden" 

vb:VBDockingManager.WindowSize="0,0"
FocusNames="Lines,Postings" /> 

<vb:VBDesign VBContent="*Explorer" 
vb:VBDockingManager.Container="DockableWindow" 
vb:VBDockingManager.DockState="AutoHideButton" 
vb:VBDockingManager.DockPosition="Right" 
vb:VBDockingManager.IsCloseableBSORoot="False
vb:VBDockingManager.RibbonBarVisibility
="Hidden" 

vb:VBDockingManager.WindowSize="400,400" />
</vb:VBDockingManager

Falls Sie den DockState="Tabbed" vorgeben, müssen Sie "vb:VBDockingManager.Container" immer auf "TabItem" setzen. Sonst immer als "DockableWindow".

Falls Sie in VBDesign untergeordnete Geschäftsobjekte anzeigen wollen, können Sie mit der Eigenschaft "IsCloseableBSORoot" steuern, ob das Fenster vom Anwender rechts oben geschlossen werden darf. Mit der Eigenschaft "RibbonBarVisibility" steuern Sie, ob das Menüband versteckt werden soll.

Mit "WindowSize" definieren Sie die X/Y-Größe des Fensters, das erscheint wenn Sie die Maus über den Button bewegen.

 

Automatische Fokussierung

Im Kapitel für Geschäftsobjekte sehen Sie ein Beispiel wie Sie ein Geschäftsobjekt im Hintergrund öffnen und einen Filter setzen können, um den richtigen Datensatz anzuzeigen. Bei hierarchischen Master-Detail-Beziehungen kann es vorkommen, dass es viele ineinander geschachtelte VBDockingManager gibt. Damit beim Öffnen des Geschäftsobjektes auch die richtigen Registerkarten, innerhalb der DockingManager-Schachtelung, geöffnet werden, gibt es zwei spezielle Abhängigkeitseigenschaften:

  • "public string FocusView" in der Klasse VBDockingManager und VBTabControl.
  • "public string FocusNames" in der Klasse VBDesign und VBTabItem.

Definieren Sie eine String-Eigenschaft in Ihrem Geschäftsobjekt, die Sie dann an die FocusView-Abhängigkeitseingenschaft binden. z.B.

private string _MyFocusView;
public string MyFocusView
{
get { return _MyFocusView; }
set {
if (_MyFocusView != value)
{
_MyFocusView = value;

OnPropertyChanged("MyFocusView");
} }
}

Diese Eigenschaft speichert eine beliebeige Zeichenkette, die angibt was an der Benutzeroberfläche angezeigt bzw. fokussiert werden soll.

Nehmen wir an das Design "*InOrderForm" aus dem oberen XAML-Beispiel besteht wiederum aus einem DockingManager der zwei Karteikarten anzeigt:

<vb:VBDockingManager FocusView="{Binding MyFocusView}"
<vb:VBDesign VBContent="*InOrderLines" 
FocusNames="Lines" 
vb:VBDockingManager.Container
="TabItem" 

vb:VBDockingManager.DockState="Tabbed" 
vb:VBDockingManager.DockPosition="Bottom" /> 
<vb:VBDesign VBContent="*InOrderPostings" 
FocusNames="Postings" 
vb:VBDockingManager.Container
="TabItem" 

vb:VBDockingManager.DockState="Tabbed" 
vb:VBDockingManager.DockPosition="Right" />
</vb:VBDockingManager

Wenn nun die MyFocusView den Wert "Postings" aufweist, dann wird im äußeren Dockingmanager die Registerkarte mit "*InOrderForm" fokussiert, weil der Wert mit der kommaseparierten Aufzählung "Lines,Postings" in der Eigenschaft FocusNames vorkommt.
Der innere Dockingmanager fokussiert dann die Registerkarte mit "*InOrderPostings", weil diese die Eigenschaft FocusNames "Postings" enthält.


Zur Anordnung von Steuerelementen dienen folgende Layoutelemente:

Alle diese Steuerelemente können Sie so verwenden wie es in der Microsoft-Dokumentation beschrieben ist. Sie sind noch um folgende Funktionalitäten erweitert:

  • Style wurde dem iPlus-System angepasst.
  • Die Anordnung der Kindelemente ist so angepasst, dass keine Margins oder Paddings notwendig sind, um die Kindelemente leserlich in einem einheitlichen Abstand anzuordnen.
  • Alle implementieren die IVBContent-Schnittstelle. Ändert sich die mit VBContent gebundene Eigenschaft aufgrund der IPropertyChanged-Notification, erfolgt der Aufruf der "Global.ControlModesInfo GetControlModes(IVBContent vbControl)" Methode auf der entsprechenden ACComponent die per Datacontext oder BSOACComponent egbunden ist. Die Steuerung der Visibility-Property erfolgt entsprechend des Rückgabewertes. D.h. bei einem Wert kleiner gleich "ControlModes.Disabled" wird das Layout-Element unsichtbar oder zugeklappt.
  • Einige besitzen die Eigenschaft "CanExecuteCyclic". Geben Sie hier einen Wert in Millisekunden an, mit dem Sie steuern, in welchem Zeitintervall das CanExecute-RoutedEvent auf allen Kindelementen ausgeführt wird, die per CommandBinding gebunden sind. Praktisch gesehen bedeutet dies, falls Sie eine Taste (VBButton) an eine Methode gebunden haben, die serverseitig implementiert ist, wird in diesem Zeitintervall eine IsEnabled-Abfrage per Netzwerk ausgeführt, um die Taste entweder zu aktivieren oder zu deaktivieren.

VBTabControl ist eine Erweiterung von TabControl, VBTabItem und TabItem.

Die Funktion der Eigenschaften FocusView und FocusNames haben Sie bereits im VBDockingManager-Abschnitt kennen gelernt.

Um die Überschrift eines TabItem zu setzen, verwenden Sie anstatt der Header-Eigenschaft, die ACCaption-Eigenschaft:

<vb:VBTabControl FocusView="{Binding MyFocusView}">
<vb:VBTabItem ACCaption="Lines" FocusNames="Lines">
</vb:VBTabItem>
<vb:VBTabItem ACCaption="Postings" FocusNames="Postings">
</vb:VBTabItem>
</vb:VBTabControl>

 


Die ACCaption-Eigenschaft besitzen fast alle nachfolgenden iPlus-Steuerelemente. Wenn Sie eine ACCaption-Eigenschaft explizit setzen, dann wird beim erstmaligen Anzeigen des Steuerelementes, ein Übersetzungseintrag in der Tabelle ACClassText angelegt. Gehen Sie anschliessend in die Entwicklungsumgebung und übersetzen die Texte in der Registerkarte "Übersetzungen". Beim erneuten Öffnen wird die anzuzeigende Beschriftung mit dem übersetzten Text ersetzt.

Hinweis: Da die Zeichenkette in ACCaption für den Zugriff per ACIdentifier in der ACClassText-Tabelle dient, sollten Sie möglichst kein Leerzeichen verwenden!

 

Steuerelemente mit Beschriftungen

Die meisten iPlus-Steuerelemente, die nachfolgend beschrieben sind, besitzen eine Beschriftung, die automatisch durch die Auflösung des VBContent ermittelt wird. Diese Beschriftung können Sie mit der Eigenschaft ShowCaption ausschalten. Die automatische Beschriftung kann durch Setzen der ACCaption-Eigenschaft übersteuert werden.

Das Beschriftungsfeld und das eigentliche Inhaltselement (z.B. Textbox, Checkbox...) werden in einem Grid mit zwei Spalten angeordnet. Das Verhältnis der Breite von Beschriftung und dem Inhaltselement wird durch die Eigenschaften WidthCaption (15*)WidthContent (20*), WidthCaptionMax (150) und WidthContentMax () bestimmt. Dieses Standard-Verhältnis gilt für alle folgenden iPlus-Steuerelemente die Beschriftungen besitzen, damit die Masken einheitlich aussehen.

 

Steuerelemente mit zweitem VBContent

Die Steuerelemente VBTextBox2 und VBComboBox2 besitzen eine VBContent2-Eigenschaft, mit der man einen zweiten Wert anzeigen kann, der in logischer Beziehung zum ersten Wert steht. Beispielweise man möchten eine Einheit anzeigen, die rechts daneben angezeigt werden soll. In diesem Fall hat das Grid eine dritte Spalte. Die Breite wird durch die Eigenschaften WidthCaption2 (10*) und WidthCaption2Max () gesteuert.


VBButton ist eine Erweiterung von Button und implementiert IVBContent. Geben Sie in VBContent eine Kommandomethode an und stellen Sie ein Ausrufezeichen an den Anfang. Die Taste wird automatisch deaktiviert, wenn der Benutzer keine Rechte hat oder eine IsEnabled-Methode vorhanden ist. Falls ein Proxyobjekt gebunden ist und die IsEnabled-Methode eine serverseitige Methode ist, dann können sie explizit das CommandBinding veranlassen die CanExecute-Prüfung zyklisch durchführen zu lassen.

<vb:VBButton VBContent="!MyMethod" CanExecuteCyclic="2000" />
<vb:VBButton VBContentMouseDown="!MyMethod">Click me</vb:VBButton>
<vb:VBButton VBContentMouseUp="!MyMethod" />
<vb:VBButton VBContentMouseDown="\DataAccess\PLCService\PLC1\GroupA\BoolVar15=true" />
<vb:VBButton VBContentMouseUp="\DataAccess\PLCService\PLC1\GroupA\BoolVar15=false" />

In VBContentMouseUp und VBContentMouseDown können Sie entweder einen Methodenaufruf oder eine Variablenzuweisung deklarieren.

 

VBTextBox ist eine Erweiterung von TextBox.

Eine VBTextBox besitzt eine Beschriftung vor der eigentlichen Textbox. Lesen Sie den Abschnitt ACCaption wie Sie die Beschriftung automatisch setzen, ändern und die Breitenverhältnisse einstellen können.

<vb:VBTextBox VBContent="CurrentMaterial\MaterialName" />

VBTextBox2 ist eine Variante der VBTextBox, die rechts neben der TextBox noch ein weiteres Ausgabefeld besitzt, deren Inhalt Sie per VBContent2 deklarieren.

<vb:VBTextBox2 VBContent="CurrentMaterial\MaterialName" 
VBContent2="CurrentMaterial\BaseMDUnit\MDUnitName" />

VBTextBox3 ist eine weitere Variante der VBTextBox, die rechts neben der TextBox noch ein weiteres Eingabefeld (Combobox) besitzt, deren Inhalt Sie per VBContent2 deklarieren.

<vb:VBTextBox3 VBContent="CurrentMaterial\MaterialName" 
VBContent2="CurrentMaterial\BaseMDUnit"
VBSource2="MDUnitList"/>

 

Maskierung

Zur Maskierung verwendet die VBTexBox die MaskedTextProvider-Klasse. VBTextBox stell dafür drei Eigenschaften zur Verfügung: Mask, IncludePrompt und IncludeLiterals.

 

Formattierung

Um die Zahlendarstellung zu Formatieren, verwenden Sie die StringFormat-Eigenschaft. Der Wert wird der StringFormat-Eigenschaft der Binding-Klasse übergeben. Die Formatierungs-Syntax finden Sie unter: https://docs.microsoft.com/de-de/dotnet/standard/base-types/formatting-types

<vb:VBTextBox VBContent="OrderLine\TargetQuantity" StringFormat="#,0.0" />

 


VBTextBox und die nachfolgenden Eingabe-Steuerelemente, besitzen folgende gemeinsame Eigenschaften:

 

Automatisches setzen des Eingabecursors

Mit der Eigenschaft AutoFocus, die Sie innerhalb eines Designs bei nur einem Steuerelement setzen sollten, kontrollieren Sie welches Steuerelement den Tastatur-Focus erhalten soll. Dazu wird die Methode "Focus" in der Klasse UIElement aufgerufen.

 

Deaktivieren des Kontextmenüs

Sind mehrere iPlus-Steuerelemente ineinander geschachtelt, können Sie mit der Eigenschaft "DisableContextMenu" steuern, bei welchen Steuerelementen kein Kontextmenü geöffnet werden darf. Damit vermeiden Sie die doppelte Anzahl gleicher Befehle.

 

Eingabevalidierung

WPF sieht zur Validierung von eingegebenen Werten die Nutzung der Klasse ValidationRule vor. In iPlus wurde diese Klasse durch die Klasse VBValidationRule erweitert. Damit kann die Validierungsmethode per ACUrlCommand aufgerufen werden.

Die Signatur der Validierungsmethode muss folgendermaßen aussehen:

[ACMethodInfo("ACClass", "en{'Validate input'}de{'Überprüfe Eingabe'}", 492, false)]
public Msg ValidateInput(string vbContent, object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
{
return new Msg() { MessageLevel = eMsgLevel.Info };
}
else
{
switch (vbContent)
{
case "CurrentNewVisualisation\\ACIdentifier":
case "CurrentVisualisation\\ACIdentifier":
{
String strValue = value as String;
if (String.IsNullOrEmpty(strValue))
return new Msg() { MessageLevel = eMsgLevel.Info };
if (strValue.ContainsACUrlDelimiters() || strValue.Contains(" "))
{
Msg msg = new Msg { ACIdentifier = this.ACCaption,
Message = Root.Environment.TranslateMessage(this, "Warning00002"),
MessageLevel = eMsgLevel.Error };
return msg;
}
break;
}
}
}
return new Msg() { MessageLevel = eMsgLevel.Info };
}

Der erste Übergabeparameter enthält den VBContent-Wert des Steuerelementes, den diese Methode zur Validierung aufgerufen hat. Geben Sie eine Msg-Instanz mit dem Level "Error" zurück wenn die Validierung fehlgeschlagen ist, damit das Steuerelement den Fehlertext als Tooltip-Text anzeigen kann.

<vb:VBTextBox VBContent="CurrentMaterial\MaterialName" VBValidation="!ValidateInput" />

 

Deaktivieren von Steuerelementen 

Die Basisklasse ACComponent besitzt folgende virtuelle Methode:

public virtual Global.ControlModesInfo GetControlModes(IVBContent vbControl)

Diese Methode prüft folgende Eigenschaften:

  1. Ob der Benutzer entsprechend seiner Gruppenrechte den gebundenen Wert im Steuerelement, lesen oder ändern darf.
  2. Prüft die in der Entwicklungsumgebung eingestellten Min-/Max- Grenzwerte. Dafür wird die virtuelle Methode "CheckPropertyMinMax" aufgerufen, die Sie in Ihrer Ableitung überschreiben können.
  3. Führt eine Inhaltsbezogene Prüfung durch, indem die virtuelle Methode "OnGetControlModes" aufgerufen wird, die Sie in Ihrer Ableitung überschreiben können:
public override Global.ControlModes OnGetControlModes(IVBContent vbControl)
{
if (vbControl == null)
return base.OnGetControlModes(vbControl);
Global.ControlModes result = base.OnGetControlModes(vbControl);
if (result < Global.ControlModes.Enabled)
return result;
switch (vbControl.VBContent)
{
case "ShowFromBaseClass":
if (CurrentACClass != null)
result = Global.ControlModes.Enabled;
else
result = Global.ControlModes.Hidden;
break;
case "IsVisibleConfigTarget":
if (IsVisibleConfigTarget)
result = Global.ControlModes.Enabled;
else
result = Global.ControlModes.Collapsed;
break;
}
return result;

Dauerhaftes deaktivieren des Steuerelements können Sie über die Eigenschaft "DisabledModes" im XAML-Code deklarieren:

  • Collapsed: Zeigt das Element nicht an und reserviert keinen Platz dafür im Layout.
  • Hidden: Zeigt das Element nicht an, aber reserviert Platz für das Element im Layout.
  • Disabled: Element kann nicht auf Benutzerinteraktion reagieren.

 

<vb:VBTextBox VBContent="CurrentMaterial\MaterialName" DisabledModes="Disabled" />

 


Diese drei Steuerelemente dienen zur Anzeige von Texten die entweder:

  • fest im XAML-Code gesetzt,
  • per Databinding aus einer gebundenen Eigenschaft gelesen,
  • oder per ACClassText-Tabelle übersetzt werden.

 

VBTextBlock

VBTextBlock ist eine Erweiterung von TextBlock. Wenn Sie die Text-Eigenschaft nicht explizit gesetzt haben, können Sie diese automatisch setzen:

  • VBContent: Zeigt den in der Entwicklungsumgebung unter Bezeichnung angegebenen Wert an.
  • ACCaption: Zeigt den übersetzten Text aus der entsprechenden ACClassText an.
  • Übersetzungstupel: Direkte Anzeige des im XAML eingegebenen Übersetzungstextes.
<vb:VBTextBlock VBContent="Content\FacilityBookingNo"/>
<vb:VBTextBlock Style="{vb:VBStaticResource globalStyleHeadlineText}" Text="ABC"/>
<vb:VBTextBlock ACCaption="lblOutwardLots" />
<vb:VBTextBlock ACCaption="en{'Filter'}de{'Filtern'}" />

 

VBHeader

Die Funktionsweise des VBHeader ist mit dem VBTextBlock identisch. Verwenden die den VBHeader für Überschriften von zusammengehörigen Bereichen innerhalb eines Layoutelementes (z.B. VBGrid, VBStackPanel...).

 <vb:VBHeader ACCaption="lblOutwardLots" />

 

VBTranslationText

VBTranslationText dient zur Anzeige von Übersetzungstexten aus der Tabelle ACClassText. In VBContent geben Sie die ACUrl zum Text an:

 <vb:VBTranslationText vb:VBContent="\Mixery\HopScale1§Question50037"
vb:ShowText="{vb:VBBinding VBContent="\\DataAccess\\PLCService\\PLC1\\GroupA\\BoolVar15"
vb:Blink="true" />

Mit ShowText steuern Sie, ob der Text angezeigt oder ausgeblendet werden soll. Wenn Blink auf "true" gesetzt wird, dann blinkt der Text. Damit können Sie wichtige Texte besser hervorheben (z.B. Alarme).


VBCheckBox ist eine Erweiterung von CheckBox.

Beide Steuerelemente besitzen eine Beschriftung vor dem eigentlichen Steuerelement. Lesen Sie dazu den Abschnitt ACCaption wie die Beschriftung automatisch gesetzt, geändert und auch die Breitenverhältnisse eingestellt werden können.

<vb:VBCheckBox VBContent="IsEnabled" />

 

VBRadioButtonGroup ist ein ItemsControl das eine Liste von RadioButtons anzeigt. Geben Sie im VBContent eine Selected-Eigenschaft an:

<vb:VBRadioButtonGroup VBContent="CurrentConfigSaveMode" ShowCaption="False" />
 

VBDatePicker ist eine Erweiterung von DatePicker zur Auswahl eines Datums. Verwenden Sie VBDateTimePicker falls Sie auch die Uhrzeit auswählen möchten.

Beide Steuerelemente besitzen eine Beschriftung vor dem eigentlichen Steuerelement. Lesen Sie dazu den Abschnitt ACCaption wie die Beschriftung automatisch gesetzt, geändert und auch die Breitenverhältnisse eingestellt werden können.

<vb:VBDatePicker VBContent="PostingDate" />
<vb:VBDateTimePicker VBContent="PostingDate" />
<vb:VBDateTimePicker VBContent="PostingDate" Format="LongDate" />
<vb:VBDateTimePicker VBContent="PostingDate" Format="Custom" FormatString="YYYY.MM.DD" />

Mit den Format-Eigenschaften können Sie die Formatierung explizit definieren. Siehe https://docs.microsoft.com/de-de/dotnet/standard/base-types/standard-date-and-time-format-strings.

 


VBComboBox ist eine Erweiterung von ComboBox

Eine VBComboBox besitzt eine Beschriftung vor der eigentlichen ComboBox. Lesen Sie dazu den Abschnitt  ACCaption wie die Beschriftung automatisch gesetzt, geändert und auch die Breitenverhältnisse eingestellt werden können.

 

Comboboxen sind Selector-Elemente und implementieren die Schnittstelle IVBSource. Die Schnittstelle definiert per VBContent die Selected-Eigenschaft und bindet automatisch die ItemsSource.

<vb:VBComboBox VBContent="CurrentMaterial\MDMaterialGroup" />
<vb:VBComboBox VBContent="SelectedInOrderPos" VBSource="InOrderPosList" />

 

VBComboBox2 ist eine weitere Variante, die rechts neben der ComboBox noch ein weiteres Ausgabefeld besitzt, deren Inhalt Sie per VBContent2 deklarieren:

<vb:VBComboBox2 VBContent="CurrentOrderLine\Material" 
VBContent2="CurrentOrderLine\Material\MaterialName1" />

 


VBListBox ist eine Erweiterung von ListBox

Eine VBListBox besitzt eine Beschriftung vor der eigentlichen ListBox. Lesen Sie dazu den Abschnitt  ACCaption wie die Beschriftung automatisch gesetzt, geändert und auch die Breitenverhältnisse eingestellt werden können.

VBListBox sind Selector-Elemente und implementieren die Schnittstelle IVBSource. Die Schnittstelle definiert per VBContent die Selected-Eigenschaft und bindet automatisch die ItemsSource.

<vb:VBListBox VBContent="CurrentMaterial\MDMaterialGroup" />
<vb:VBListBox VBContent="SelectedInOrderPos" VBSource="InOrderPosList" />

In der Eigenschaft VBShowColumns können Sie ein kommaseparierte Liste von Spalten angeben. Die Spalten adressieren Sie in ACUrl-Syntax relativ zum VBContent:

<vb:VBListBox VBContent="SelectedInOrderPos" VBSource="InOrderPosList" 
VBShowColumns="Material\MaterialName,Quantity"/>

 


VBDataGrid ist eine Erweiterung von DataGrid.

VBDataGrid sind Selector-Elemente und implementieren die Schnittstelle IVBSource. Die Schnittstelle definiert per VBContent die Selected-Eigenschaft und bindet automatisch die ItemsSource.

Spalten in VBDataGrid können Sie auf zwei verschiedene Varianten deklararieren:

  1. In der Eigenschaft VBShowColumns können Sie ein kommaseparierte Liste von Spalten angeben. Die Spalten adressieren Sie in ACUrl-Syntax relativ zum VBContent.
  2. Sie Verwenden die in iPlus erweiterten Spaltentypen VBDataGridTextColumnVBDataGridComboBoxColumnVBDataGridCheckBoxColumn
    VBDataGridDateTimeColumn oder VBDataGridTemplateColumn
    .

Für größere Datenmengen empfehlen wir Ihnen die Verwendung der Zeilenvirtualisierung mittels der EnableRowVirtualization-Eigenschaft und dem Virtualisierungmodus "Recycling":

<vb:VBDataGrid VBContent="SelectedFacilityCharge"  
EnableRowVirtualization="True" 

VirtualizingStackPanel.IsVirtualizing="True" 
VirtualizingStackPanel.VirtualizationMode="Recycling">
<DataGrid.Columns>  
<vb:VBDataGridTextColumn VBContent="Material\MaterialNo" />  
<vb:VBDataGridTextColumn VBContent="Material\MaterialName1">  
<DataGridTextColumn.ElementStyle>  
<Style TargetType="vb:VBTextBlock">
<Style.Triggers>  
<DataTrigger Value="True">
<DataTrigger.Binding>
<Binding Converter="{vb:ConverterBoolean vb:ACUrlCommand=!HighlightCell}" />
</DataTrigger.Binding>
<Setter Property="Background" Value="Yellow" />  
</DataTrigger>
</Style.Triggers>  
</Style>  
</DataGridTextColumn.ElementStyle>  
</vb:VBDataGridTextColumn>  
<vb:VBDataGridTextColumn VBContent="StockQuantity" StringFormat="#,0.0" VBIsReadOnly="true"/>
<vb:VBDataGridComboBoxColumn VBContent="FacilityLot" />  
<vb:VBDataGridCheckBoxColumn VBContent="IsNotAvailable" />  
<vb:VBDataGridDateTimeColumn VBContent="InsertDate" />
   <vb:VBDataGridTemplateColumn Header="Image">
     <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
         <Image Source="{Binding DefaultThumbImage}" />
       </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
   </vb:VBDataGridTemplateColumn>
</DataGrid.Columns>

</vb:VBDataGrid>

 


VBTreeView ist eine Erweiterung von TreeView.

VBTreeView sind Selector-Elemente und implementieren die Schnittstelle IVBSource. Die Schnittstelle definiert per VBContent die Selected-Eigenschaft und bindet automatisch die ItemsSource.

Damit Sie hierarchische Strukturen per VBContent anzeigen können, müssen die gebundenen Elemente (Ihr Modell) die Schnittstelle "gip.core.datamodel.IACContainerWithItems" und optional "gip.core.datamodel.IVBDataCheckbox" implementieren.

IACContainerWithItems ist eine Ableitung von IACContainer. Es gibt alternativ noch eine generische Schnittstelle IACContainerWithItemsT<T, S>. Diese Schnittstelle dient der Erstellung einer Baumstruktur, indem in der Eigenschaft "IEnumerable<IACContainerWithItems> Items" die Kindelemente auflistet. VBTreeView durchläuft diese Items-Eigenschaft, um die grafischen VBTreeViewItem-Elemente (Ableitung von TreeViewItem) anzuzeigen.

Falls Ihre Modellklasse IVBDataCheckbox implementiert, sind die Baumelemente mit einer CheckBox versehen. IVBDataCheckBox besitzt die Eigenschaften IsChecked und IsEnabled. Diese Eigenschaften werden automatisch an die entsprechenden Abhängigkeitseigenschaften, der Checkbox gebunden.

Wie auch bei Comboboxen und Datagrids können Sie in der Eigenschaft VBShowColumns eine kommaseparierte Liste von Spalten angeben, die in einem TreeViewItem angezeigt werden sollen. Die Spalten adressieren Sie in ACUrl-Syntax relativ zum VBContent.

Wichtig: Im Gegensatz zu VBComboBox, VBListBox und VBDataGrid müssen Sie VBSource explizit setzen. Im VBContent geben Sie die Selected-Eigenschaft an und in VBSource das Root-Element ihres Baum-Modells, das IACContainerWithItems implementiert:

 <vb:VBTreeView 
        VBContent="SelectedTreeItem" 
        VBSource="RootTreeItem" 
        VBShowColumns="ACCaption" 
        SortOrder="ACCaption" 
        AllowDrop="False" 
        ShowCaption="True">
</vb:VBTreeView>

Sie können VBTreeView auch nach klassischer Weise mittels HierarchicalDataTemplates verwenden. Ihr gebundenes Modell muss dann auch nicht IACContainerWithItems implementieren. In diesem Fall dürfen Sie die VBContent und die VBSource-Eigenschaft nicht setzen


VBProgressBar ist eine Erweiterung von ProgressBar.

Das Design der VBProgressBar ist dem Style von iPlus angepasst. Es implementiert IVBContent, damit Sie die Value-Eigenschaft automatisch per VBContent binden können:

<vb:VBProgressBar VBContent="CurrentProgressInfo\TotalProgressPercent" />

Setzen Sie die Eigenschaften der RangeBase-Klasse, um die Grenzen einzustellen:

<vb:VBProgressBar 
Maximum="{vb:VBBinding Converter={vb:ConverterDouble}, vb:VBContent=CurrentProgressInfo\\TotalProgressRangeTo}"
Minimum="{vb:VBBinding Converter={vb:ConverterDouble}, vb:VBContent=CurrentProgressInfo\\TotalProgressRangeFrom}"
Value="{vb:VBBinding Converter={vb:ConverterDouble}, vb:VBContent=CurrentProgressInfo\\TotalProgressCurrent}" />

Falls Sie nicht den Bereich kennen, den Ihre gebundene Value-Eigenschaft haben wird, setzen Sie die Eigenschaft IsIndeterminate-Eigenschaft, um dem Benutzer mitzuteilen, dass Ihr Programm aktiv ist.

<vb:VBProgressBar IsIndeterminate="true" vb:VBContent=CurrentProgressInfo\\IsBusy}" />

Lesen Sie im Kapitel "Aufgaben im Hintergrund" nach wie man die VBProgressBar in Verbindung mit einem Geschäftsobjekt verwendet.

 

Alternative Designs

Mit der Eigenschaft ProgressBarStyles ProgressBarStyle können Sie die Progressbar in verschiedenen Designs anzeigen lassen:

public enum ProgressBarStyles : short
{
DefaultBar = 0,
NormalPie = 1,
GlassyPie = 2,
Circular = 3,
CircularSegmented = 4,
CircularPoints = 5,
StopWatch = 6,
PerformantBar = 7,
CircularUnlimited = 8
}

Beispiel, um eine VBProgressBar als Stoppuhr anzuzeigen:

<vb:VBProgressBar 
vb:ProgressBarStyle="StopWatch"
Maximum="{vb:VBBinding Converter={vb:ConverterDouble vb:ValueFromSubProperty=TotalSeconds}, vb:VBContent=WaitingTime}"
Value="{vb:VBBinding Converter={vb:ConverterDouble vb:ValueFromSubProperty=TotalSeconds}, vb:VBContent=ElapsedTime}">
</vb:VBProgressBar>

In der Assembly gip.core.visualcontrols finden Sie die Klasse VBFillLevel die VBProgressBar mit weiteren Designs erweitert, um einen Füllstandsbalken anzeigen zu können:

<vbv:VBFillLevel Orientation="Vertical" Foreground="#FFFFE100" Height="250"
VBContent="FillLevel"
Maximum="{vb:VBBinding vb:VBContent=MaxWeightCapacity}"
ShowTickBar="True"
TickFrequency="10">
</vbv:VBFillLevel>

 


VBSlider ist eine Erweiterung der Slider-Klasse.


VBPropertyLogChart ist ein Steuerelement um Diagramme (vorwiegend Liniendiagramme) anzuzeigen. In der Regel werden Eigenschaftswerte bzw. der Änderungsverlauf von Eigenschaftswerten einer ACComponent angezeigt. VBPropertyLogChart kann entweder Livedaten oder Archivdaten anzeigen.

 

VBPropertyLogChart besitzt die Eigenschaft ChartControl vom Typ IVBChart. IVBChart ist ein Interface, das Steuerelemente implementieren müssen, die zuständig sind für die Präsentation der Diagramme und protokollierte Eigenschaftswerte von ACComponents anzeigen sollen. Das bedeutet, dass im Grunde genommen VBPropertyLogChart die Liniendiagramme gar nicht selbst zeichnet, sondern das Steuerelement, das seiner ChartControl-Eigenschaft zugewiesen ist. iPlus stellt standardmäßig zwei verschiedene Chart-Controls zur Verfügung, die IVBChart implementieren:

  1. VBChartPlotter ist eine ältere Implementierung von "Interactive Data Display for WPF" https://github.com/microsoft/InteractiveDataDisplay.WPF (Früher: Dynamic Data Display).
  2. VBSciChartSurface ist eine Ableitung von SciChart.

Beide Chart-Controls besitzen durch IVBChart die Eigenschaft ObservableCollection<IVBChartItem> PropertyLogItems. In dieser Liste definieren Sie welche Eigenschaften im Diagramm gezeichnet werden sollen, indem Sie die Liste mit VBPropertyLogChartItem füllen und die VBContent-Eigenschaft setzen, um die Eigenschaften zu adressieren (IVBChartItem erbt die VBContent-Eigenschaft von der IVBContent-Schnittstelle).

VBPropertyLogChartItem ist nur eine Wrapper-Klasse für WPF und kapselt intern eine Instanz von PropertyLogChartItem, die letztendlich die Serie von Live- oder Archivwerten speichert (Klasse PropertyLogListInfo).

 Im folgenden Beispiel wird VBChartPlotter zur Gewichtsanzeige einer Waage verwendet. Mit den Eigenschaften "LineColor" und "LineThickness" kontrollieren Sie die Darstellung der Linie. Wenn "LineColor" nicht gesetzt wird, dann wird eine Zufallsfarbe gewählt:

 

Um dasselbe Beispiel mit SciChart zu realisieren, müssen Sie mehr XAML-Code deklarieren, weil SciChart ein umfangreiches Steuerelement ist. Lesen Sie dazu bitte zuerst die Online-Dokumentation durch. Grundsätzlich müssen Sie die X- und Y-Achsen und den ChartModifiers deklarieren:

 

Normalerweise müssen in SciChart sogenannte "Series" deklariert werden. Diese können Sie jedoch weglassen, weil stattdessen IVBChart.PropertyLogItems-Liste gelesen wird. Sie können allerdings beides kombinieren, wenn Sie zusätzliche Eigenschaften der Series benötigen. Dazu müssen Sie in RenderableSeries die Name-Eigenschaft mit einem eindeutigen Schlüssel versehen. In VBPropertyLogChartItem referenzieren Sie auf die RenderableSeries indem Sie diesen Schlüssel in der Eigenschaft LineId setzen. Im folgenden Beispiel wird dies mit den Schlüsseln "BoolSeriesA" und "DoubleSeriesB" gemacht:

Das Beispiel verwendet zudem zwei unterschiedliche Y-Achsen. Die "ID"-Eigenschaft dient dazu die entsprechende Achse zu identifizieren. In VBPropertyLogChartItem verwenden Sie die Eigenschaft "AxisId" um die entsprechende Achse zu referenzieren. Wenn Sie zusätzlich noch RenderableSeries verwenden, dann referenzieren Sie die Achse per "YAxisId".