Feedback

C# - DoubleToThickness Konverter

Veröffentlicht von am 2/5/2014
(0 Bewertungen)
In den XAML-Design abhängigen Projekten (WPF, WP, Win8, Silverlight) benutzt mn Thickness-Objekte zum angeben von Einrückungen. Die Eigenschaften für die einzelnen Seiten kann man aber nicht einzeln binden. Mit einem MultiKonverter ist es noch recht einfach 4 Werte zu übergeben und dann ein Thicksness-Objekt daraus zu erstellen.

Außer WPF unterstützt aber keine Vorlage einen solchen Multikonverter.
Die hier gezeigte Klasse Konvertiert einen Double-Wert in ein Thickness-Objekt. Das Format für den Parameter sieht wie folgt aus: #,#,#,#
Die #-Zeichen stehen für die einzelnen Seiten: Links, Oben, Rechts und Unten. Wenn ein #-Zeichen angegeben wurde, wird der Double-Wert eingesetzt. Andernfalls wird der Wert für diese Seite übernommen.

Getestete Plattformen
Windows Phone 8
WPF, Win8 und Silverlight sollten sich nur wenig unterscheiden

Benötigte Namspaces
System
System.Globalization
System.Windows
System.Windows.Data

Verwendung im XAML
1. Resource vom Konverter erstellen:
<Page.Resources>
<local:DoubleToThicknessConverter x:Key="ToThicknessConverter"/>
</Page.Resources>

2. Bindung erstellen indem die Konverter-Resource sowie ein Konverterparameter angegeben wird:
<Slider Name="slider" Maximum="300" VerticalAlignment="Top" />
<Border Margin="{Binding Value, ConverterParameter=#\,100\,10.5\,10, Converter={StaticResource ToThicknessConverter}, ElementName=slider}" Background="Red"/>
/// <summary>
/// Stellt einen Konverter von einem Double-Wert in ein Thickness-Objekt bereit.
/// </summary>
public class DoubleToThicknessConverter : IValueConverter
{
    #region IValueConverter Member

    /// <summary>
    /// Konvertiert einen Double-Wert in ein Thickness-Objekt.
    /// </summary>
    /// <param name="value">Der gebundene Double-Wert.</param>
    /// <param name="targetType">Wird ignoriert.</param>
    /// <param name="parameter">Das Format, in dem der Wert in das Thickness-Objekt übertragen werden soll.<para/>
    /// Folgenden Aufbau soll diese Zeichenfolge haben: #,#,#,#<para/>
    /// Jedes #-Zeichen wird gegen <paramref name="value"/> ausgetauscht. Die Restlichen Werte werden beibeihalten. 
    /// Die Abstände für die einzelnen Seiten werden an den Kommas unterschieden. Die Reihenfolge lautet: Links, Oben, Rechts, Unten</param>
    /// <param name="culture">Wird ignoriert.</param>
    /// <returns>Ein <see cref="System.Windows.Thickness"/>-Objekt.</returns>
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //Param ist wie folgt aufgebaut: #,#,#,#
        //# wird durch den gebundenen Wert ersetzt. Die Komams werden entfernt. Der Rest bleibt.
        double val = (double)value;
        var parts = parameter.ToString().Split(',');
        return new Thickness(parts[0] == "#" ? val : double.Parse(parts[0], CultureInfo.InvariantCulture),
                             parts[1] == "#" ? val : double.Parse(parts[1], CultureInfo.InvariantCulture),
                             parts[2] == "#" ? val : double.Parse(parts[2], CultureInfo.InvariantCulture),
                             parts[3] == "#" ? val : double.Parse(parts[3], CultureInfo.InvariantCulture));
    }

    /// <summary>
    /// Wird nicht unterstützt. Es wird immer eine <see cref="System.NotSupportedException"/>-Exception ausgelöst.
    /// </summary>
    /// <exception cref="System.NotSupportedException">Wird immer ausgelöst.</exception>
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    #endregion
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!