1. 程式人生 > 其它 >WPF依賴屬性-依賴屬性的傳遞(繼承)

WPF依賴屬性-依賴屬性的傳遞(繼承)

 依賴屬性的傳遞,在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>