【问题标题】:Add Dependency Property to existing .NET class将依赖属性添加到现有的 .NET 类
【发布时间】:2013-01-14 12:48:30
【问题描述】:

在 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 类吗?

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

顺便说一句:仅更改边距(厚度)的一个组件的解决方案也值得赞赏;)

【问题讨论】:

标签: wpf dependency-properties


【解决方案1】:

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

【讨论】:

  • 我应该把这个附加属性的注册放在哪里,以便从 FrameworkElement 派生的所有控件都可以使用它?
  • 您可以在任何类上定义它——甚至不必是依赖对象。当然,当您要设置附加属性时,您必须引用定义该属性的类。所以 local:FrameworkElementExtensions.MarginLeft=20 例如其中 local 映射到您定义它的 clr 命名空间(例如,如果它在本地程序集和 clr 命名空间 foo 中,则 xmlns:local="clr-namespace:foo") .
  • 话虽如此,如果您打算直接设置 Margin 属性而不是使用附加属性,那么这种方法确实无法正常工作。我的意思是如果 xaml 处理器在实际 Margin 属性设置之前应用您的属性怎么办?您必须注意 Margin 属性何时更改,如果您不是更改的人,则重新插入您的更改。此外,如果 Margin 属性上有绑定,您最终可能会删除/踩到绑定(因为您的值将是本地值属性优先级)。
  • 可能能够使用 DependsOnAttribute 来影响道具的顺序,但我不确定它的效果如何。我最后一次尝试使用它 - 在 WPF 中很早 - 它没有做任何事情。文档表明它会影响 XamlWriter.Save 的顺序。
  • 这不是我需要的,我必须得出结论。我不需要附加属性,因此我可以执行 FrameworkElementExtensions.MarginLeft=20。我只希望每个 FrameWorkElement(及其派生类)都可以使用 MarginLeft。并像这样使用它:btnAdd.MarginLeft = 20, txtLabel.MarginLeft=15, etc.
【解决方案2】:

如果您只想更改边距的一个组件,请在 xaml Margin="1,2,3,4" 中使用,其中 1 - 左,2 - 上,3 - 右,4 - 下

【讨论】:

  • 我当然知道……但我希望能够仅设置上边距,而不影响从其他地方的样式设置的其他边距(左、右、下)。 ..
  • 不...不会影响其他边距吗?
  • 对不起,它不起作用...也许它可以帮助stackoverflow.com/questions/10657275/…
猜你喜欢
  • 2021-03-10
  • 2010-11-20
  • 2023-02-22
  • 1970-01-01
  • 2012-12-25
  • 2017-04-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
相关资源
最近更新 更多