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 PlattformenWindows Phone 8
WPF, Win8 und Silverlight sollten sich nur wenig unterscheiden
Benötigte NamspacesSystem
System.Globalization
System.Windows
System.Windows.Data
Verwendung im XAML1. 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
}