WPF依賴屬性-依賴屬性的傳遞(繼承)
阿新 • • 發佈:2021-06-28
依賴屬性的傳遞,在XAML邏輯樹上, 內部的XAML元素,關聯了外圍XAML元素同名依賴屬性值 ;
<Window x:Class="Custom_DPInherited.DPInherited" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" FontSize="18" Title="依賴屬性的繼承"> <StackPanel > <Label Content="繼承自Window的FontSize" /> <Label Content="顯式設定FontSize" TextElement.FontSize="36"/> <StatusBar>Statusbar沒有繼承自Window的FontSize</StatusBar> </StackPanel> </Window>
在上面XAML程式碼中。Window.FontSize設定會影響所有內部子元素字型大小,這就是依賴屬性的值傳遞。如第一個Label沒有定義FontSize,所以它繼承了Window.FontSize值。但一旦子元素提供了顯式設定,這種繼承就會被打斷,所以Window.FontSize值對於第二個Label不再起作用。
但是,並不是所有元素都支援屬性值繼承的,如StatusBar、Tooptip和Menu控制元件。另外,StatusBar等控制元件截獲了從父元素繼承來的屬性,使得該屬性也不會影響StatusBar控制元件的子元素。例如,如果我們在StatusBar中新增一個Button。那麼這個Button的FontSize屬性也不會發生改變,其值為預設值
獲取外圍依賴屬性值
定義自定義依賴屬性時,可通過AddOwer方法可以使依賴屬性,使用外圍元素的依賴屬性值。具體的實現程式碼如下所示
public class CustomStackPanel : StackPanel { public static readonly DependencyProperty MinDateProperty; static CustomStackPanel() { MinDateProperty = DependencyProperty.Register("MinDate", typeof(DateTime), typeof(CustomStackPanel), new FrameworkPropertyMetadata(DateTime.MinValue, FrameworkPropertyMetadataOptions.Inherits)); } public DateTime MinDate { get { return (DateTime)GetValue(MinDateProperty); } set { SetValue(MinDateProperty, value); } } } public class CustomButton :Button { private static readonly DependencyProperty MinDateProperty; static CustomButton() { // AddOwner方法指定依賴屬性的所有者,從而實現依賴屬性的傳遞,即CustomStackPanel的MinDate屬性可以傳遞給CustomButton控制元件。 // 注意FrameworkPropertyMetadataOptions的值為Inherits MinDateProperty = CustomStackPanel.MinDateProperty.AddOwner(typeof(CustomButton), new FrameworkPropertyMetadata(DateTime.MinValue, FrameworkPropertyMetadataOptions.Inherits)); } public DateTime MinDate { get { return (DateTime)GetValue(MinDateProperty); } set { SetValue(MinDateProperty, value); } } }
<Window x:Class="Custom_DPInherited.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Custom_DPInherited"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="實現自定義依賴屬性的值傳遞" Height="350" Width="525">
<Grid>
<local:CustomStackPanel x:Name="customStackPanle" MinDate="{x:Static sys:DateTime.Now}">
<!--CustomStackPanel的依賴屬性-->
<ContentPresenter Content="{Binding Path=MinDate, ElementName=customStackPanle}"/>
<local:CustomButton Content="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=MinDate}" Height="25"/>
</local:CustomStackPanel>
</Grid>
</Window>