Silverlight4Beta之Style的改进

简介:


这个改进虽然不大,但是个人认为绝对意义重大。且听俺慢慢道来…

玩过WPF的人再搞SL肯定觉得不爽。单说Style的定义,SL中没有隐式定义,也就是说某个控件要想引用定义好的Style就必须要写Style="{StaticResource style1}" 而那个定义的Style必须有x:key="style1",这太令人不爽了!还好群众的呼声加上微软的自我反省使得sl4beta出现之际就解决了这个烦人的问题。

(当然,WPF中早就可以这么做)

以上是牢骚,以下步入正题

做个例子,我们希望在同一个Grid中的Button都是蓝色,另外一个Grid中的Button为蓝色

<UserControl x:Class="SilverlightApplication14.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <StackPanel   
        x:Name="layoutRoot">
        <Grid   
            Background="White">
            <Grid.Resources>
                <Style   
                    TargetType="Button">
                    <Setter   
                        Property="Background"
                        Value="Blue" />
                </Style>
            </Grid.Resources>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Button   
                Content="Button 1" />
            <Button   
                Grid.Row="1"
                Content="Button 2" />
        </Grid>
        <Grid   
            Background="White">
            <Grid.Resources>
                <Style   
                    TargetType="Button">
                    <Setter   
                        Property="Background"
                        Value="Red" />
                </Style>
            </Grid.Resources>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Button   
                Content="Button 3" />
            <Button   
                Grid.Row="1"
                Content="Button 4" />
        </Grid>
    </StackPanel>

</UserControl>  

 

注意,代码中的每个Style定义都没有x:Key,这样我们便隐式的将Style应用于所有适用的(其TargetType指定的)控件之上了。看图

image

也就是说,通过此方法,我们终于可以定义全局的控件样式而不用再写那些又臭又长的StaticeResource…了。

如果我们有多个隐式Style并且指定同一类型的控件(如TargetType="Button"),sl4并不会将它们的定义合并在一起:( 比如我们在UserControl级定义一个Style使得所有其作用的控件的FontSize等于36:

<UserControl.Resources>
    <Style     
    TargetType="Button">
        <Setter     
                Property="FontSize"     
                Value="36" />
    </Style>
</UserControl.Resources>  

运行后你会发现这个Style并未生效。不过隐式定义的Style仍然可以使用BaseOn指定其要继承的Style定义。

<Style  TargetType="Button"  
        BasedOn="{StaticResource myStyle}">
    <Setter Property="Background"  
            Value="Blue" />
</Style>  
<Grid.Resources>
    <Style  TargetType="Button"  
            BasedOn="{StaticResource myStyle}">
        <Setter  Property="Background"  
                 Value="Red" />
    </Style>
</Grid.Resources>  

这样就可以了,看图:

image

如果一个控件的样式被一个显示定义的Style所定义,那么它不会接受任何隐式Style的定义,最终代码如下:

<UserControl x:Class="SilverlightApplication14.MainPage"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
    mc:Ignorable="d"  
    d:DesignHeight="300" d:DesignWidth="400">

    <UserControl.Resources>
        <Style  
            x:Key="myStyle" TargetType="Button">
            <Setter  
                Property="FontSize"  
                Value="36" />
        </Style>
    </UserControl.Resources>

    <StackPanel  
        x:Name="layoutRoot">
        <Grid  
            Background="White">
            <Grid.Resources>
                <Style  
                    TargetType="Button"  
                    BasedOn="{StaticResource myStyle}">
                    <Setter  
                        Property="Background"  
                        Value="Blue" />
                </Style>
            </Grid.Resources>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Button  
                Content="Button 1" />
            <Button  
                Grid.Row="1"  
                Content="Button 2" />
        </Grid>
        <Grid  
            Background="White">
            <Grid.Resources>
                <Style  
                    TargetType="Button"  
                    BasedOn="{StaticResource myStyle}">
                    <Setter  
                        Property="Background"  
                        Value="Red" />
                </Style>
            </Grid.Resources>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Button  
                Content="Button 3" />
            <Button  
                Grid.Row="1"  
                Content="Button 4"  
                Style="{StaticResource myStyle}"/>
        </Grid>
    </StackPanel>

</UserControl>  

image

Button4仍然使用默认的背景颜色

 

总的来说,大爽!











本文转自紫色永恒51CTO博客,原文链接:http://www.cnblogs.com/024hi/archive/2009/11/19/1606415.html ,如需转载请自行联系原作者



相关文章
|
数据安全/隐私保护
Silverlight 代水印的查询文本框 Style
原文http://www.cnblogs.com/caodaiming/archive/2012/12/12/2815094.html   ...
805 0
|
索引 Windows
Silverlight之ListBox/Style学习笔记--ListBox版的图片轮换广告
ListBox是一个很有用的控件,其功能直逼Asp.Net中的Repeater,它能实现自定义数据项模板,纵向/横向排列Item(如果扩展一下实现自行折行,几乎就是SL版的Repeater了--实际上WrapPanel已经实现了,不过没有默认集成在SL3中).
941 0
|
前端开发 .NET 开发者
Silverlight项目中"自定义控件开发/Style"学习笔记
本文不涉及高深的设计模式(比如mvc,mvvm之类),也没有太多的编程技巧,只是记录自己做为asp.net开发者学习silverlight中自定义控件开发的一些过程,高手请绕过。  先推荐一篇不错的文章http://www.cnblogs.com/carysun/articles/1259025.html 写得很全面,只不过图片讲解不够丰富,初学者可能有些感到跳跃性大了一些。
995 0

热门文章

最新文章