windows phone (12) 小试自定义样式

原文:windows phone (12) 小试自定义样式

样式在BS开发中经常用到,在wp中系统也提供了解决办法,就是对设置的样式的一种资源共享,首先是共享资源的位置,它是在App类中,之前我们已经有介绍到设置公共属性存放临时数据,可参考windows phone 三种数据共享的方式(8),同样共享的样式我们也在app类中实现,系统在App.xaml文件中已经给我们提供了Resources集合:

  <!--应用程序资源-->
    <Application.Resources>
        
    </Application.Resources>

 我们只需要在上面标签中加入我们自定义的样式即可,适用于此资源的对象是有FrameworkElement派生的类,此类派生类的列表如下:

 

 Microsoft.Internal.Pivot.Controls.VisualTreeGraft
        System.Windows.Controls.Border
        System.Windows.Controls.ContentPresenter
        System.Windows.Controls.Control
        System.Windows.Controls.DrawingSurface
        System.Windows.Controls.Image
        System.Windows.Controls.ItemsPresenter
        System.Windows.Controls.MediaElement
        System.Windows.Controls.MultiScaleImage
        System.Windows.Controls.Panel
        System.Windows.Controls.Primitives.Popup
        System.Windows.Controls.RichTextBlock
        System.Windows.Controls.RichTextBlockOverflow
        System.Windows.Controls.TextBlock
        System.Windows.Controls.Viewbox
        System.Windows.Controls.WebBrowser
        System.Windows.Documents.Glyphs
        System.Windows.Shapes.Shape

 

 以上类或者以上类中派生的类都可以使用此共享资源,这里是指自定义样式,接下来按照上一篇内容的做法,我们给内容区域的Textblock设置前景色,所以在App.xaml 自定义样式可以这样:

 <!--应用程序资源-->
    <Application.Resources>
        <LinearGradientBrush x:Key="lgBrush">
            <GradientStop Offset="0" Color="AliceBlue"></GradientStop>
            <GradientStop Offset="1" Color="BurlyWood"></GradientStop>
        </LinearGradientBrush>
    </Application.Resources>

 x:Key特性是唯一标示该资源的一个键名,在共享资源中必须唯一;自定义样式定义好了,怎么使用那,比较繁琐的做法是这样,不提倡:

<TextBlock x:Name="tbContent" Text="显示样式" HorizontalAlignment="Center" VerticalAlignment="Center">
            <TextBlock.Foreground>
                <StaticResource ResourceKey="lgBrush"></StaticResource>
            </TextBlock.Foreground>
        </TextBlock>

 比较常用的书写是这样:

  <TextBlock x:Name="tbContent" Text="显示样式" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="{StaticResource lgBrush}">
            </TextBlock>

 可以看到这里有个大括号,它就是xaml标记扩展,在xaml标记扩展中是不能使用引号的,比如这里的lgBrush不能使用引号;上面两种方法实现的效果一样:即

此外我们还可以看到MainPage类在xaml文件中已经定义了Foreground,但是在tbContent中我们依然看到了我们自定义的颜色,这说明样式设置的优先级高于继承来的样式的优先级;以上两种方法是实现在xaml文件中对样式的使用,我们也可以在隐藏文件(.cs)进行访问,但是必须是在构造函数完成之后,例如我们可以这样访问刚刚定义的样式:

 

View Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace ShareStyle
{
    public partial class MainPage : PhoneApplicationPage
    {
        // 构造函数
        public MainPage()
        {
            InitializeComponent();
            LinearGradientBrush lgBrush = (LinearGradientBrush)this.Resources["lgBrush"];
            TextBlock tb = new TextBlock();
            tb.Name = "tbName";
            tb.VerticalAlignment = VerticalAlignment.Center;
            tb.HorizontalAlignment = HorizontalAlignment.Center;
            tb.Text = "隐藏代码实例化的";
            tb.Foreground = lgBrush;
            this.ContentPanel.Children.Add(tb);
           
        }
    }
}

如果想使用该样式的话,就像上面的代码实例化样式,并设置Textblock的前景色为lgBrush,还有另一种写法是将自定义样式中的x:Key改为x:Name,隐藏文件中设置前景色就可以是这样:(此处有疑问:根据教材中的说法,我怎么也获取不到设置的颜色)

 tb.Foreground = lgBrush;

 不需要实例化该自定义颜色,需要注意的是如果使用x:Name资源,该名称必须是在xaml文件中保持唯一性;


 上面的案例是说明怎么自定义某个属性(Foreground )的样式,下面是为特定的元素定义样式集合

<phone:PhoneApplicationPage>
<phone:PhoneApplicationPage.Resources>
        <Style x:Key="tbStyle" TargetType="TextBlock">

         <Setter Property="HorizontalAlignment" Value="Center"></Setter>
        </Style>
    </phone:PhoneApplicationPage.Resources>
</phone:PhoneApplicationPage>

 上面实例代码中x:Key表示键名,在使用该样式的时候会用到,TargetType是指此样式的使用对象元素,Style标签中Setter标签是设置适用此样式的元素属性;

实例代码:

<phone:PhoneApplicationPage>
    <phone:PhoneApplicationPage.Resources>
        <Style x:Key="tbStyle" TargetType="TextBlock">
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
            <Setter Property="Foreground">
                <Setter.Value>
                    <LinearGradientBrush>
                        <GradientStop Offset="0.2" Color="Brown"></GradientStop>
                        <GradientStop Offset="0.7" Color="DarkBlue"></GradientStop>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </phone:PhoneApplicationPage.Resources>
</phone:PhoneApplicationPage>

 在TextBlock元素中的使用xaml标记扩展得到该样式:

<TextBlock x:Name="tbContent" Text="显示样式" HorizontalAlignment="Center" VerticalAlignment="Center" Style="{StaticResource tbStyle}"  />

 得到的效果是这样子的:

 

 

时间: 2024-10-30 21:31:45

windows phone (12) 小试自定义样式的相关文章

给.NET中的Windows窗体加载Xp样式

window|加载 给.NET中的Windows窗体加载Xp样式 作者:Heath Stewart 介绍 当Windows XP 带着他特有的可视化样式或者主题发布时,许多人为他拥有的华丽界面而兴奋.然而,当.NET1.0正式版本发布的时候,许多人包括我自己为Windows 窗体不支持Windows XP 的可视化样式而失望.我对可视化样式的API函数和微软的.NET框架开发文档进行了一番研究,而后认识到为.NET应用程序加上Xp样式也不是很难. 下面的将通过一个简单的程序来为你的程序和控件加上

WPF自定义控件与样式(6)-ScrollViewer与ListBox自定义样式

原文:WPF自定义控件与样式(6)-ScrollViewer与ListBox自定义样式 一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: ScrollViewer的样式拆解及基本样式定义: ListBox集合控件的样式定义:   二.ScrollViewer自定义样式 ScrollViewer在各种列表.集合控件中广泛使用的基础组建,先看看效果图: 如上

WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式

原文:WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式 一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: CheckBox复选框的自定义样式,有两种不同的风格实现: RadioButton单选框自定义样式,有两种不同的风格实现: 二. CheckBox自定义样式 2.1 CheckBox基本样式 标准CheckBox样式代

织梦ckeditor添加自定义按钮,实现自定义样式

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 织梦到了5.7之后编辑器不再是fck,而是升级成了ckeditor3.6.2.在我们对内容页面的body正文部分进行编辑的时候,前台正文部分有的时候需要一个自定义样式,但ckeditor并没有自定义样式涉及. 例如页面:http://www.badubox.com/game/500.html, 可以看到有虚线边框的地方,就是自定义样式. 当然

progressbar-android动态创建progressBar自定义样式不显示。

问题描述 android动态创建progressBar自定义样式不显示. 我自定义progressBar样式的时候,在xml布局文件里用style=自己在styles文件中定义的style可以实现. 用程序动态创建的时候,progressbar = new progressbar(this)也可以实现,但没法自定义,是使用的默认的. 如果用progressbar = new progressbar(this,null,style1)就实现不了,啥都不显示,该怎么办呢? 解决方案 好吧,没人回答,

Word入门动画教程103:用自定义样式建目录

如果对要建立目录的标题使用了自定义样式(有关样式的创建和使用将在以后的教程中具体介绍),同样可以依此建立目录,步骤如下: 1.将插入点置于要插入目录的位置. 2.执行"插入"→"引用"→"索引和目录"→"目录"选项卡. 3.单击"选项"按钮,打开"目录选项"对话框. 4.在"有效样式"下删除内置样式的目录级别数字,例如"标题 1",查找应用于文档的

wpf日历控件制作过程分析(2) 自定义样式属性

接上篇wpf日历控件制作过程分析(1) 定义header 在header中,我们看到了定义一个自定义样式TitleStyle 1.自定义样式 看后台代码定义 Code /**//// <summary> /// The DependencyProperty for the TitleStyle property. /// Flags: none /// Default Value: null /// </summary> public static readonly Depende

应用-bootstrap自定义样式与原样式优先级问题

问题描述 bootstrap自定义样式与原样式优先级问题 <div class="form-group form-inline col-md-10 col-md-offset-1"> <label class="control-label">联系方式</label> <input class="input_of_sign form-control" style="margin-left: 2em

WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

原文:WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式 一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: DataGrid自定义样式: ListView自定义样式: 二.DataGrid自定义样式 DataGrid是常用的数据列表显示控件,先看看实现的效果(动态图,有点大): DataGrid控件样式结构包括以下几个部分