Laden...

CustomMarkupExtension im XAML konfigurieren

Erstellt von IamTheBug vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.501 Views
I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 7 Jahren
CustomMarkupExtension im XAML konfigurieren

Hi,

ich habe für diverse Zwecke eine eigene MarkupExtension erstellt und verwende diese im XAML Code.
Das funktioniert sehr gut. Ich habe z.B. eine MarkupExtension um Bilder nachzuladen und auf Buttons zu legen oder auch zur Lokalisation.
Allerdings steckt in all diesen MarkupExtensions immer eine winzige Funktionalität die sich auf das aktuelle Projekt bezieht. Somit lässt sich das ganze nicht in eine Bibliothek auslagern und universell nutzen.

Ich habe aber schon oft bei anderen Bibliotheken/Projekten gesehen das die MarkupExtension bevor sie benutzt wird im XAML Code configuriert wird.
Zum Beispiel so:


<window 
    x:Class="Klasse"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    
    xmlns:local="clr-namespace:local"
    xmlns:images="clr-namespace:local.Images"
    
    MinWidth="300" MinHeight="300" 
    images:ImageFolder="resourcen\images"

    mc:Ignorable="d">

   
    <Grid>
        <ToolBarControl>
            <BarButtonItem Content="test"
                               Glyph="{images:Image cmdSave, Size=Size16}" 
                               LargeGlyph="{images:Image cmdSave}"/>
       </ToolbarControl>
    </Grid>

Wie man sieht wird bei dem BarButton das Glyph über die Image MarkupExtension gesetzt.
Und weiter oben (das ist was ich erreichen möchte) wird das ganze konfiguriert und gesagt wo die Bilder liegt:


images:ImageFolder="resourcen\images"

Wie wird sowas umgesetzt?
Wie gesagt bei anderen Projekten habe ich das schon gesehen das es möglich ist. Aber ich weiss nicht wie man es umsetzen kann.

Viele Grüße

Mfg

IamTheBug

5.658 Beiträge seit 2006
vor 7 Jahren

Hi IamTheBug,

wenn ich es richtig verstanden hab, ist dein Ziel, eine Liste von Bildern anzuzeigen?

Dafür braucht es keine MarkupExtensions. Verwende stattdessen einfach ein ItemsControl, das du an eine ViewModel-Eigenschaft mit einer Auflistung der Bildpfade oder Bildobjekte bindest.

Weeks of programming can save you hours of planning

I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 7 Jahren

Es geht nicht um das "Bilderding". Das war nur ein Beispiel.
Es geht mir expliziet um die oben genannte Frage. Ich würde das gerne auch auf andere MarkupExtensions anwenden die andere Funktonalität besitzen.

Mfg

IamTheBug

656 Beiträge seit 2008
vor 7 Jahren

In der Form (XAML-Namespace plus "Property"?) kenne ich das eigentlich nicht, sondern nur über statische Properties (Klasse Punkt Property, mit optionalem XAML-Namespace). Und das ist keine wirkliche Magic, sondern nur ein stinknormales Dependency Property.

Ansehen kann man das unter anderem in der WPF Localization Extension (Beispielnutzung hier)

I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 7 Jahren

Danke Bhaal.
Auf diese Bibliothek bezog ich mich auch als ich meinte ich habe das schon einmal gesehen.
Ich wusste aber nicht genau wie es umzusetzen ist.
Das Schlüsselwort zum Erfolg heisst hier also DependencyProperty? Das wollte ich nur wissen wonach ich in dem Quelltext suchen muss. Dann schaue ich mir den Quelltext einmal genauer an.

Mfg

IamTheBug

656 Beiträge seit 2008
vor 7 Jahren

Damit du in WPF ein Binding draufsetzen kannst - ja, dazu brauchst du ein DependencyProperty.
Wenn du nur statische String-Werte nutzt, kannst du vielleicht sogar ein normales Property machen; aber das müsste man einfach ausprobieren.