在WPF项目中,我有一堆控件,我希望能够设置单独的Margin
属性并保存其他值。所以,我想避免将完整的保证金设置为新的Thickness
(Margin="0,5,0,15"
)。因为许多边距是从样式等设置的。但在个别情况下,我想偏离某些控件的泛型样式。
我想,为什么不在.NET类FrameWorkElement
上注册几个新的依赖项属性(例如,只显示MarginLeft):
public class FrameWorkElementExtensions: FrameworkElement
{
public static readonly DependencyProperty MarginLeftProperty = DependencyProperty.Register("MarginLeft", typeof(Int16?), typeof(FrameworkElement), new PropertyMetadata(null, OnMarginLeftPropertyChanged));
public Int16? MarginLeft
{
get { return (Int16?)GetValue(MarginLeftProperty); }
set { SetValue(MarginLeftProperty, value); }
}
private static void OnMarginLeftPropertyChanged(object obj, DependencyPropertyChangedEventArgs e)
{
if (obj != null && obj is UIElement)
{
FrameworkElement element = (FrameworkElement)obj;
element.Margin = new Thickness((Int16?)e.NewValue ?? 0, element.Margin.Top, element.Margin.Right, element.Margin.Bottom);
}
}
}
但是这个属性在代码隐藏或XAML中不可用。我可以以某种方式理解它,因为这个虚拟类从未被实例化或者无论如何。试图使它成为一个静态类,但你不能从FrameWorkElement派生(我需要GetValue和SetValue方法)。
我在网上找不到任何处理更通用问题的资源:你可以在退出.NET类中添加依赖项属性吗?
感谢任何帮助/明智的建议。
顺便说一句:我们也赞赏只改变边距(厚度)的一个组成部分的解决方案;)
答案 0 :(得分:4)
如果要定义要在您不拥有的对象上设置的属性,则需要定义附加属性,在这种情况下,您将使用RegisterAttached方法而不是Register。您还可以将属性定义为静态get / set方法,而不是实例属性,因为这不会在对象的实例上设置,而是在某个未知的frameworkelement上设置。链接中的帮助主题显示了一个示例。其他评论中的链接也提供了更多信息和示例。
答案 1 :(得分:-2)
如果你想在xaml Margin =“1,2,3,4”中只改变一个保证金的一个组成部分,其中1 - 左,2 - 顶部,3 - rigth,4 - 底部