将依赖属性添加到现有.NET类

时间:2013-01-14 12:48:31

标签: wpf dependency-properties

在WPF项目中,我有一堆控件,我希望能够设置单独的Margin属性并保存其他值。所以,我想避免将完整的保证金设置为新的ThicknessMargin="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类中添加依赖项属性吗?

感谢任何帮助/明智的建议。

顺便说一句:我们也赞赏只改变边距(厚度)的一个组成部分的解决方案;)

2 个答案:

答案 0 :(得分:4)

如果要定义要在您不拥有的对象上设置的属性,则需要定义附加属性,在这种情况下,您将使用RegisterAttached方法而不是Register。您还可以将属性定义为静态get / set方法,而不是实例属性,因为这不会在对象的实例上设置,而是在某个未知的frameworkelement上设置。链接中的帮助主题显示了一个示例。其他评论中的链接也提供了更多信息和示例。

答案 1 :(得分:-2)

如果你想在xaml Margin =“1,2,3,4”中只改变一个保证金的一个组成部分,其中1 - 左,2 - 顶部,3 - rigth,4 - 底部