从代码后台实现这个很容易:
var button = new Button();
var margin = button.Margin;
margin.Right = 10;
button.Margin = margin;
然而,在XAML中,我只能使用以下内容:
<Button Margin="0,0,10,0" />
这个问题的困境在于我有可能通过将其他边距值(比如左,上,下)设为零来覆盖它们。是否有办法让XAML像下面这样呢?<Button MarginRight="10" />
从代码后台实现这个很容易:
var button = new Button();
var margin = button.Margin;
margin.Right = 10;
button.Margin = margin;
然而,在XAML中,我只能使用以下内容:
<Button Margin="0,0,10,0" />
这个问题的困境在于我有可能通过将其他边距值(比如左,上,下)设为零来覆盖它们。是否有办法让XAML像下面这样呢?<Button MarginRight="10" />
可以使用附加属性。事实上,这正是附加属性的目的:访问父元素属性或为特定元素添加额外功能。
例如,在应用程序的某个地方定义以下类:
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;
}
}
}
}
}
现在你只需在 XAML 中声明以下命名空间:
xmlns:ap="clr-namespace:YourApp.AttachedProperties"
然后你可以编写类似以下的 XAML:
<Button ap:MoreProps.MarginRight="10" />
或者,您可以避免使用附加属性,而是编写稍微冗长一些的XAML代码,例如:
<Button>
<Button.Margin>
<Thickness Right="10" />
</Button.Margin>
</Button>
尽管附加属性可以工作,但我建议您重构代码,使其不要在代码后台进行UI更改。您应该尽可能在文件的设计侧处理UI。我尽量少使用xaml文件的代码后台,因为它会导致MVVM方面的问题。
你可以将Margin数据绑定到MVVM中的属性(字符串)。在MVVM中,你只需要跟踪各个属性(顶部、右侧、底部、右侧)。
你可以使用转换器,例如:如何在XAML中仅设置顶部边距? 或 仅绑定WPF控件的Margin属性的一部分
你在这部分是错误的:
var button = new Button();
button.Margin.Right = 10;
Margin="0,0,10,0"
,因为它会覆盖已有的Thickness
。请注意,这里的“覆盖”是指替换或重写现有的Thickness
属性,并非添加到现有属性中。 - H.B.