Startseite  Inhaltsverzeichnis  <<  >>  

Kapitel 11 - Custom Controls

11.1 Grundlagen

In Avalon ist es selbstverständlich, dass Sie auch eigene Komponenten bzw. UI-Elemente erzeugen und natürlich auch verwenden können. Diese Elemente können Sie wie unter Windows Forms erzeugen, oder Sie verwenden eine Mischung aus XAML und C#-Code. Als Ausgabetyp verwenden Sie eine Klassenbibliothek. Wenn Sie mit dem Visual Studio einen neuen Projekttyp Avalon Control Library erzeugen, wird nur eine C#-Datei erzeugt. Die XAML-Datei ist manuell, z.B. über eine umbenannte XML-Datei, hinzuzufügen (wie gesagt geht es auch ohne XAML). Die C#-Datei enthält dazu eine KLasse, die von Control abgeleitet ist. Dadurch können Sie das neue Element positionieren etc. Die Klasse muss als partial deklariert werden, damit auch die korrespondierende XAML-Datei verwendet wird. Jetzt können Sie darin Eigenschaften definieren oder Code unterbringen.

RedCarpet.xaml.cs
namespace MyAvControl
{
  public partial class RedCarpet : Canvas
  {
    private Brush bg = Brushes.White;
    public Brush BackgroundX
    {
      get
      {
        return bg;
      }
      set
      {
        bg = value;
        this.Background = value;
      }
    }
  }
}
In der XAML-Datei wird der Code in ein Canvas-Element eingeschlossen, um eine einfache Positionierung vornehmen zu können. Weiterhin ist ein Verweis auf die partielle C#-Klasse über def:Class="MyAvControl.RedCarpet" notwendig. Als Inhalt wird ein rotes Rechteck mit blauem Rahmen und ein Button verwendet. Es können also auf diese Weise auch verbundene UI-Elemente erzeugt werden (z.B. ein kleiner Taschenrechner).

RedCarpet.xaml
<Canvas xmlns="http://schemas.microsoft.com/2003/xaml"
        def:Class="MyAvControl.RedCarpet"
        xmlns:def="Definition">
  <Rectangle Fill="LightBlue" Width="100" Height="100" Stroke="Red" />
  <Button>Hallo</Button>
</Canvas>

11.2 Einbinden des UI-Elements

Damit das UI-Element in XAML verwendet werden kann, muss zuerst die Assembly eingebunden werden. Dies erfolgt über die PI <?Mapping?>. Als XmlNamespace wird ein beliebiger Name verwendet. Der ClrNamespace muss mit dem Namespace des einzubindenden Kontrollelements korrespondieren. Der Name der Assembly wird über das Attribut Assembly angegeben, normalerweise ohne die Endung .dll. Dann definieren Sie ein Kürzel für Ihren neuen Namespace (hier mcc) und können dann über das Kürzel auf den Klassennamen des Kontrollelements zugreifen.
<?Mapping XmlNamespace="MyAvControl" ClrNamespace="MyAvControl" 
Assembly="MyAvControl"?>  

<Window def:Class="AvalonApplication1.Window1"
   xmlns="http://schemas.microsoft.com/2003/xaml"
xmlns:def="Definition"
    Text="My Avalon Control - Test"
    xmlns:mcc="MyAvControl">
    <Grid>
      <mcc:RedCarpet Width="200" Height="150" Background="Green" />
    </Grid>
</Window>


Source: Kap11.zip