我有一个包含网格子元素的循环。对于每个子元素,我想知道哪些属性在XAML代码中已经被明确指定了。我有机会找出吗?
例如:我有一个TextBox
<TextBox Height="150"/>
只有属性Height在XAML代码中给出。我该如何在C#代码中找到它? 换句话说,我不想要TextBox的所有属性,而只想要在XAML中指定的那些属性。
我有一个包含网格子元素的循环。对于每个子元素,我想知道哪些属性在XAML代码中已经被明确指定了。我有机会找出吗?
例如:我有一个TextBox
<TextBox Height="150"/>
只有属性Height在XAML代码中给出。我该如何在C#代码中找到它? 换句话说,我不想要TextBox的所有属性,而只想要在XAML中指定的那些属性。
这是一个具有挑战性的问题,但幸运的是,我喜欢接受挑战。所以一开始,我找到了DependencyPropertyHelper.GetValueSource
方法。该方法接受一个DependencyObject
和一个DependencyProperty
并返回一个ValueSource struct
:
ValueSource valueSource = DependencyPropertyHelper.GetValueSource(SomeTextBlock,
TextBlock.TextWrappingProperty);
ValueSource struct
有一个BaseValueSource枚举
属性,其成员如下所示:
DependencyProperty
的优先级列表相关,并指定了更改DependencyProperty
值的不同方式。 BaseValueSource枚举
实例值为Local
意味着使用SetValue
方法在本地设置了属性...这也包括使用SetValue
方法在代码中设置属性的实例。 框架使用此方法从XAML标记设置值。DependencyObject
的所有DependencyProperty
的集合,以便我们可以在每个上调用上述方法以查看它是否由SetValue
方法设置。 我希望Microsoft会给我们提供一些可以为我们完成此操作的东西,但似乎没有。Reflection
进行此操作的方法。 但是,我继续寻找,然后找到了一种更好的方法...一种更好的方法。 我在Visual Studio Forum的Getting list of all dependency/attached properties of an Object问题中找到了它。DependencyPropertyHelper
类。 起初,我想“让我只运行此DependencyPropertyHelper.GetValueSource
方法以查看我得到什么”,并期望得到的所有DependencyProperty
的长列表。MarkupObject
,一个MarkupProperty
和一个MarkupWriter
。 我以前没有使用过这些,但似乎这实际上是查看为TextBlock
定义的XAML。 因此,在帮助您的同时,我也学到了一些新东西... +1好问题。ValueSource结构体
的部分,直接使用该方法。如果需要更多帮助,请告诉我。public class MyTextBox : TextBox
{
public MyTextBox()
{
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
Console.WriteLine(string.Format("Property changed: {0} {1}", e.Property.Name, e.NewValue));
base.OnPropertyChanged(e);
}
}
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid>
<local:MyTextBox x:Name="TB" Height="150"></local:MyTextBox>
</Grid>
</Window>
不幸的是,您也会收到由样式更改的属性
以下是上述代码的结果
属性已更改:UndoManagerInstance MS.Internal.Documents.UndoManager
属性已更改:Instance System.Windows.Documents.TextEditor
属性已更改:XmlnsDictionary System.Windows.Markup.XmlnsDictionary
属性已更改:IWindowService WpfApplication1.MainWindow
属性已更改:Name TB
属性已更改:Height 150
属性已更改:Background #FFFFFFFF
属性已更改:BorderBrush #FFABADB3
属性已更改:Foreground #FF000000
属性已更改:BorderThickness 1,1,1,1
属性已更改:TabNavigation None
属性已更改:FocusVisualStyle
属性已更改:AllowDrop True
属性已更改:PanningMode VerticalFirst
属性已更改:IsFlicksEnabled False
属性已更改:Template System.Windows.Controls.ControlTemplate
属性已更改:XmlNamespaceMaps System.Collections.Hashtable
属性已更改:XmlnsDictionary System.Windows.Markup.XmlnsDictionary
属性已更改:XmlNamespaceMaps System.Collections.Hashtable
属性已更改:IsVisible True
属性已更改:ActualWidth 509
属性已更改:ActualHeight 150
属性已更改:PageHeight 148
Local
设置其值的属性。 - XAMeLi