簡體   English   中英

如何從 xaml 獲取顯式指定的屬性

[英]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方法設置。 我希望微軟能給我們一些東西來為我們做這件事,但似乎沒有。

快速搜索后,我找到了一種在DependencyObjectList 屬性中使用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

根據 Sheridan's answer 中提供的鏈接,這里是獲取 XAML 中元素上設置的所有屬性所需的非常小的代碼片段:

MarkupWriter.GetMarkupObjectFor(element).Properties

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM