[英]How to get explicit specified properties from xaml
我有一個帶有網格子元素的循環。 對於每個孩子,我想知道在 XAML 代碼中明確指定了哪些屬性。 我有機會知道嗎?
例如:我有一個文本框
<TextBox Height="150"/>
XAML-Code 僅提供屬性 Height。 我如何在 c# 代碼中找到它? 換句話說,我不想要 TextBox 的所有屬性,而只想要 XAML 中指定的那些屬性。
這是一個具有挑戰性的問題,但對你來說幸運的是,我喜歡一個很好的挑戰。 所以最初,我找到了DependencyPropertyHelper.GetValueSource
方法。 此方法接受一個DependencyObject
和一個DependencyProperty
並返回一個ValueSource struct
:
ValueSource valueSource = DependencyPropertyHelper.GetValueSource(SomeTextBlock,
TextBlock.TextWrappingProperty);
ValueSource struct
具有BaseValueSource enum
屬性,該屬性具有以下成員:
這些值與DependencyProperty
優先級列表DependencyProperty
並指定可以更改DependencyProperty
值的不同方式。 Local
BaseValueSource enum
實例值意味着該屬性是使用SetValue
方法在本地設置的……這還將包括使用SetValue
方法在代碼中設置屬性的實例。 框架使用此方法從 XAML 標記設置值。
唯一的問題是,我們現在必須找到特定DependencyObject
的所有DependencyProperty
的集合,以便我們可以對每個對象調用上述方法以查看它是否由SetValue
方法設置。 我希望微軟能給我們一些東西來為我們做這件事,但似乎沒有。
快速搜索后,我找到了一種在DependencyObject的List 屬性中使用Reflection
來執行此操作的方法? 在 StackOverflow 上發帖。 不過,我一直在尋找,然后跨過一個更好的方法......一個更好的方法來。 我在 Visual Studio 論壇上的對象問題的所有依賴項/附加屬性的獲取列表中找到了它。
如果您在該頁面上查看 Zhou Yong 的回答,您可以找到他創建的DependencyPropertyHelper
類。 起初我想“讓我運行這個DependencyPropertyHelper.GetValueSource
方法來看看我得到了什么”,並期待一長串TextBlock
的所有DependencyProperty
的列表。
然而,事實證明,這種方法的結果正是您所追求的。 它只返回在 XAML 中實際設置的屬性。 在他的代碼中,我看到了一個MarkupObject
、一個MarkupProperty
和一個MarkupWriter
。 我以前沒有使用過這些,但似乎這實際上是在查看為TextBlock
定義的 XAML。 因此,在幫助您的過程中,我實際上也學到了一些新東西... +1 好問題。
牢記這一點,我相信您可以忽略我前面關於ValueSource struct
答案,而只需使用該方法。 如果您需要更多幫助,請告訴我。
您可以在自己的代碼中繼承 TextBox。 然后可以覆蓋 PropertyChanged,您將收到任何更改的屬性。
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
屬性已更改:實例 System.Windows.Documents.TextEditor
屬性已更改:XmlnsDictionary System.Windows.Markup.XmlnsDictionary
屬性更改:IWindowService WpfApplication1.MainWindow
屬性已更改:名稱 TB
屬性更改:高度 150
屬性更改:背景#FFFFFFFF
屬性更改:BorderBrush #FFABADB3
屬性更改:前景#FF000000
屬性更改:BorderThickness 1,1,1,1
屬性已更改:TabNavigation 無
屬性已更改:FocusVisualStyle
屬性更改:AllowDrop True
屬性已更改:PanningMode VerticalFirst
屬性已更改:IsFlicksEnabled False
屬性已更改:模板 System.Windows.Controls.ControlTemplate
屬性已更改:XmlNamespaceMaps System.Collections.Hashtable
屬性已更改:XmlnsDictionary System.Windows.Markup.XmlnsDictionary
屬性已更改:XmlNamespaceMaps System.Collections.Hashtable
屬性更改:IsVisible True
屬性更改:實際寬度 509
屬性更改:實際高度 150
屬性更改:PageHeight 148
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.