WPF中Dependency屬性設定順序的心得

來源:互聯網
上載者:User

今天在學習WPF相依性屬性的時候做了一個很經典的例子,即通過XMAL中的Trigger來改變按鈕的前景色彩。具體代碼如下:

 

 

Code
<Button>
            OK
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Foreground" Value="Blue"></Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
</Button>

 

可以很好的實現,將滑鼠移至按鈕上,然後按鈕的前景色彩變為藍色的功能。

但是嘗試給此按鈕設定一個Foreground屬性,代碼:

 

Code
<Button  Foreground="Black">
            OK
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Foreground" Value="Blue"></Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button

 

則使Trigger設定前者色的作用失效了。於是這便使我聯想到這幾天看到的一篇Dependency屬性計算順序的文章

(http://www.cnblogs.com/YilingLai/archive/2006/12/25/602889.html)

原來在第一步計算基礎值的時,系統是按照下面的優先順序來計算Dependency屬性的值的:

 

 

 1、Local Value                  

2、Style Triggers              

3、Template Triggers                   

4、Style Setters 

5、Theme Style Triggers    

6、Theme Style Setters     

7、Property Value Inheritance      

8、Default Value

因為Foreground="Black"屬於Local Value,比Style Triggers的優先順序要高,所以在計算過程中

它掩蓋了Style Triggers對Foreground屬性值的作用。

那麼既需要設定Foreground同時也需要通過設定Trigger來改變它怎麼做呢?

答案就是如下面代碼所示:

 

 

Code
<Window.Resources>
        <Style TargetType="{x:Type Button}" x:Key="changeColorStyle">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Foreground" Value="Blue"></Setter>
                </Trigger>
            </Style.Triggers>
            <Setter Property="Foreground" Value="Black"></Setter>
        </Style>
    </Window.Resources>
    <StackPanel>
        <Button Style="{StaticResource changeColorStyle}">
            OK
        </Button>
    </StackPanel

 

將Style提取到Window.Resources中,然後使此Button引用此資源。

因為在計算基礎值的順序時,Style Triggers排在第二,而Style Setter則排在第四的位置上。

 

Code 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.