Se puede utilizar una propiedad adjunta. De hecho, este es exactamente el propósito de las propiedades adjuntas: acceder a las propiedades del elemento principal o agregar funcionalidad adicional a un elemento específico.
Por ejemplo, defina lo siguiente clase en algún lugar de su aplicación:
using System;
using System.Windows;
using System.Windows.Controls;
namespace YourApp.AttachedProperties
{
public class MoreProps
{
public static readonly DependencyProperty MarginRightProperty = DependencyProperty.RegisterAttached(
"MarginRight",
typeof(string),
typeof(MoreProps),
new UIPropertyMetadata(OnMarginRightPropertyChanged));
public static string GetMarginRight(FrameworkElement element)
{
return (string)element.GetValue(MarginRightProperty);
}
public static void SetMarginRight(FrameworkElement element, string value)
{
element.SetValue(MarginRightProperty, value);
}
private static void OnMarginRightPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
var element = obj as FrameworkElement;
if (element != null)
{
int value;
if (Int32.TryParse((string)args.NewValue, out value))
{
var margin = element.Margin;
margin.Right = value;
element.Margin = margin;
}
}
}
}
}
En su XAML todo lo que hay que hacer es declarar el espacio de nombres siguiente:
xmlns:ap="clr-namespace:YourApp.AttachedProperties"
Y entonces usted puede escribir XAML tales como los siguientes:
<Button ap:MoreProps.MarginRight="10" />
Como alternativa, se puede evitar el uso de una propiedad adjunta y en lugar de escribir algo un poco más larga XAML tales como:
<Button>
<Button.Margin>
<Thickness Right="10" />
</Button.Margin>
</Button>
Eso XAML al final es lo mismo que 'Margen = "0,0,10,0"' como se sobrescribe el vigente 'Thickness' si hay es uno. –
@ H.B. Gracias, debería haber probado esa última parte. Tienes razón. El margen completo se reasignaría y los valores no especificados se devolverían a los valores predeterminados. He editado la respuesta para marcar esa parte. – bugged87