我有一个带有网格子元素的循环。对于每个 child ,我想知道哪些属性已在 XAML 代码中明确指定。我有机会知道吗?
例如:我有一个文本框
<TextBox Height="150"/>
只有高度属性由 XAML 代码给出。我如何在 C# 代码中找到它? 换句话说,我不需要 TextBox 的所有属性,而只需要 XAML 中指定的属性。
最佳答案
这是一个具有挑战性的问题,但幸运的是,我喜欢很好的挑战。所以最初,我找到了 DependencyPropertyHelper.GetValueSource
method .此方法采用 DependencyObject
和 DependencyProperty
并返回 ValueSource 结构
:
ValueSource valueSource = DependencyPropertyHelper.GetValueSource(SomeTextBlock,
TextBlock.TextWrappingProperty);
ValueSource 结构
有一个 BaseValueSource enum
属性,它有以下成员:
这些值与 DependencyProperty
优先级列表相关,并指定可以更改 DependencyProperty
值的不同方式。 Local
的 BaseValueSource enum
实例值意味着该属性是使用 SetValue
方法在本地设置的...这将 还包括使用 SetValue
方法在代码中设置属性的实例。框架使用此方法从 XAML 标记设置值。
唯一的问题是我们现在必须找到特定 DependencyObject
的所有 DependencyProperty
的集合,以便我们可以调用上述方法每个以查看它是否由 SetValue
方法设置。我希望 Microsoft 会为我们提供一些东西来为我们做这件事,但它似乎没有。
快速搜索后,我找到了使用 List properties of a DependencyObject? 中的 Reflection
执行此操作的方法。在 StackOverflow 上发帖。然而,我一直在寻找,然后发现了一个更好的方法……一个好得多的方法。我在 Getting list of all dependency/attached properties of an Object 中找到了它Visual Studio 论坛上的问题。
如果您在周勇的回答中查看该页面,您可以找到他创建的 DependencyPropertyHelper
类。起初我想“让我运行这个 DependencyPropertyHelper.GetValueSource
方法看看我得到了什么”,并期待 的所有
。 DependencyProperty
的长列表>文本 block
然而,事实证明,这种方法的结果正是您所追求的。它只返回 在 XAML 中实际设置的属性。在他的代码中,我看到了一个 MarkupObject
、一个 MarkupProperty
和一个 MarkupWriter
。我以前没有使用过这些,但看起来这实际上是在查看为 TextBlock
定义的 XAML。所以在帮助你的过程中,我实际上也学到了一些新东西……+1 个好问题。
考虑到这一点,我相信您可以忽略我前面关于 ValueSource struct
的回答,而只使用该方法。如果您需要更多帮助,请告诉我。
关于c# - 如何从 xaml 中获取显式指定的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119518/