Feedback

DoubleToThickness Konverter

Sprache: C#

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: [u]#,#,#,#[/u] 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. [b]Getestete Plattformen[/b] Windows Phone 8 WPF, Win8 und Silverlight sollten sich nur wenig unterscheiden [b]Benötigte Namspaces[/b] System System.Globalization System.Windows System.Windows.Data [b]Verwendung im XAML[/b] 1. Resource vom Konverter erstellen: [code]<Page.Resources> <local:DoubleToThicknessConverter x:Key="ToThicknessConverter"/> </Page.Resources>[/code] 2. Bindung erstellen indem die Konverter-Resource sowie ein Konverterparameter angegeben wird: [code]<Slider Name="slider" Maximum="300" VerticalAlignment="Top" /> <Border Margin="{Binding Value, [b]ConverterParameter=#,100,10.5,10, Converter={StaticResource ToThicknessConverter}[/b], ElementName=slider}" Background="Red"/>[/code]
/// <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
}
/// <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
}