2014-02-07 66 views
0

是否存在阻止DependecyProperty繼承的機制,或者某些值由某些元素在本地設置?DependcenyProperty是否總是繼承?

我有兩個例子,我不明白:

<Button Background="AntiqueWhite" Height="40" Width="50" FontSize="10"> 
    <Button>Test</Button>    
</Button> 

<TextBlock Text="Test" Background="AntiqueWhite" Height="40" Width="50" FontSize="10"> 
     <TextBlock />    
</TextBlock> 

按鈕元素的子按鈕沒有繼承背景/高/寬,但它繼承字號即使所有屬性都是DependencyProperty的。

在TextBlock元素情況是相同的,但我們有另一個DependencyProperty(文本)。

我明白優先級是如何工作的。本地值優先於繼承的優先級。但是如果一個控件本身設置了某些東西,我可以在哪裏獲得信息或者也許有其他一些機制阻止一些DependencyProperties被繼承?

回答

1

看到這篇文章:http://msdn.microsoft.com/en-us/library/vstudio/ms751554%28v=vs.100%29.aspx

DependencyPropertiesPropertyMetadata(相關類是FrameworkPropertyMetadata

一個描述的標誌是Inherits標誌(http://msdn.microsoft.com/en-us/library/vstudio/system.windows.frameworkpropertymetadata.inherits%28v=vs.100%29.aspx

摘錄:

繼承。默認情況下,依賴項屬性不會繼承值。 覆蓋繼承行爲允許繼承路徑也可以傳播到可視化樹中,這對於某些控制合成場景是必需的。 Note註釋

屬性值上下文中的術語「繼承」表示 專用於依賴項屬性;這意味着由於WPF屬性 系統的WPF框架級功能,子元素 可以繼承父元素 的實際依賴項屬性值。它與託管代碼類型和通過派生類型的成員繼承直接無關。有關詳細信息,請參閱屬性 值的繼承。

+0

是否有任何「簡單」的方法來檢查標誌?在你提到的鏈接中,他們寫了一些代碼。我認爲像這樣的信息將顯示在msdn的每個屬性的描述。 – Morfidon

+0

@Morfidon我沒有直接意識到一個工具,但你應該能夠使用反射器來查看具有元數據的FrameworkElement的來源。例如一個免費的JetBrains dotPeek(它也很酷:))。靜態按鈕ctor覆蓋了一些元數據,例如:FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(Button),(PropertyMetadata)new FrameworkPropertyMetadata((object)typeof(Button))); – Samuel