浅谈WPF之样式与资源

WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。

浅谈WPF之样式与资源_第1张图片

什么是样式?

样式(Style)是组织和重用格式化选项的重要工具。不是使用重复的标记填充XAML,以便设置外边距、内边距、颜色以及字体等细节,而是创建一系列封装所有这些细节的样式,然后再需要之处通过属性来应用样式。

样式是可应用于元素的属性值集合。使用资源的最常见原因之一就是样式。

基础样式

1. 通过TargetType设置样式

通过控件类型,统一设置样式【如:字体,大小,边距等】,以便于形成统一的风格。如下所示:

浅谈WPF之样式与资源_第2张图片

通过设置样式的TargetType="Button",则可以使所有的按钮应用同一个样式,统一风格。如下所示:


    
        
    
    
        
        
        
        
    

2. 通过Key设置样式

如果需要对每一个控件元素,都设置不同的样式,则可以通过不同的Key加以区分,如下所示:

浅谈WPF之样式与资源_第3张图片

分别设置不同的样式,每一个样式都有一个唯一的Key,然后分别绑定到各个元素的Style属性上,如下所示:


    
        
        
        
        
        
    
    
        
        
        
        
    

3. 样式继承

通过仔细观察发现,在设置了单独样式以后,统一的样式失去了作用,说明每一个元素控件,只能绑定一个样式,那怎么办才能让统一样式起作用呢?答案就是面向对象思想中的继承。

在WPF中,通过设置BasedOn来继承父样式,如下所示:

浅谈WPF之样式与资源_第4张图片

在每一个样式通过BasedOn属性继承父样式,如下所示:


    
        
        
        
        
        
    
    
        
        
        
        
    

注意:如果样式要被其他样式继承,则最好不要使用TargetType指定。一般情况下,可能为报错【只能根据带有基类型“IFrameworkInputElement”的目标类型的 Style。】

4. 样式中绑定事件

在WPF中的样式中,通过EventSetter进行事件绑定,如下所示:

浅谈WPF之样式与资源_第5张图片

在样式中,通过EventSetter设置事件,如下所示:


    
        
        
    
    
        
    

其中FirstButton_MouseEnter,文后台定义的一个事件函数,如下所示:​​​​​​​

private void FirstButton_MouseEnter(object sender,MouseEventArgs e)
{
      Button btn = (Button)sender;
      MessageBox.Show("鼠标进入了 "+btn.Content.ToString()+" 呀!");
}
 
  

触发器

使用触发器可自动完成简单的样式的改变,不需要使用代码,也可以完成不少工作触发器通过Style.Trigger集合链接到样式。每个样式可以有任意多个触发器。每个触发器都是System.Windows.TriggerBase的实例。

TriggerBase的子类

浅谈WPF之样式与资源_第6张图片

1. 基础触发器

触发器,是指当满足一定条件,然后触发相关的样式设置,如下所示:

浅谈WPF之样式与资源_第7张图片

示例中设置了两个触发器:1.Control.IsMouseOver鼠标覆盖在按钮上时,设置对应的样式。2. Control.IsFocused,控件聚焦时,设置对应的样式。如下所示:


    
        
    
    
        
    

注意:如果样式触发器,设置了多个,且条件相互覆盖时,以最后的设置为准

2. 多条件触发器

如果需要多个条件同时满足,才能设置对应的样式,则可以通过MultiTrigger来设置,如下所示:


    
        
    
    
        
        
    

3. 事件触发器

事件触发器,是指某一个事件发生时,触发的相关动作,主要用于动画,如下所示:

浅谈WPF之样式与资源_第8张图片

当鼠标进入时,字体变大,当鼠标离开时,字体恢复,如下所示:​​​​​​​


    
        
    
    
        
        
    

什么是资源?

资源是可以在应用程序中的不同位置重复使用的对象。WPF不仅支持传统的程序级的资源,还有独具特色的对象级资源,每一个界面元素,都可以拥有自己的资源,并被子元素共享。

资源基础用法

通常情况下,资源是在Window.Resources节点下,便于Window下所有的子元素共享,如下示例所示:

浅谈WPF之样式与资源_第9张图片

定义一个字符串类型的资源,在TextBlock中通过Text="{StaticResource default}"的方式进行引用。如下所示:


    
        
            沉舟侧畔千帆过,病树前头万木春
        
    
    
        
    

资源层级

WPF资源是采用从内到外,逐层进行查找的,如果在当前窗口未检索到资源,则继续到App.xaml中继续查找,示例如下所示:

浅谈WPF之样式与资源_第10张图片

 在App.xaml中定义资源,然后在Window中应用资源,如下所示:


    
        
            怀旧空吟闻笛赋,到乡翻似烂柯人。
        
    

在Window窗口中调用,和调用本地资源是一样的,如下所示:​​​​​​​


    
        
            沉舟侧畔千帆过,病树前头万木春。
        
    
    
        
            
            
        
        
        
    

资源分类

根据资源的加载时间点,资源分为两类,如下所示:

  1. 静态资源:静态资源是在程序启动初始化时进行加载且只加载一次的资源

  2. 动态资源:动态资源是在程序执行过程中,动态的去访问资源,会随着资源的改变而改变,所以动态资源对系统的消耗相对比较大

动态资源

上述的基础示例,采用的是静态资源的方式。动态资源则是在程序执行过程中随着资源的改变而改变。

两个按钮使用同一个资源【背景图片】,只是一个采用静态资源引用,一个采用动态资源引用,当资源发生改变时,一个不改变,一个实时变化。如下所示:

浅谈WPF之样式与资源_第11张图片

 示例源码,如下所示:


    
        
        
    
    
        
        
    

后台修改资源的代码如下所示:

private void second_Click(object sender, RoutedEventArgs e)
{
       var img = this.FindResource("one") as ImageBrush ;
       img = new ImageBrush(new BitmapImage(new Uri(@"imgs/alan_logo1.png", UriKind.Relative)));
       img.TileMode = TileMode.Tile;
       img.Opacity = 0.3;
       img.Viewport = new Rect(0, 0, 50, 50);
       img.ViewportUnits = BrushMappingMode.Absolute;
       this.Resources["one"] = img;
       //注意:此处是直接重写覆盖资源key=one的对象,并不是对原资源设置ImageSoure属性。两者效果不同
}

资源文件

资源文件位于Properties/Resources.resx中,如果想要在程序中访问资源文件的内容,则必须将访问修饰符设置成public,如下所示:

浅谈WPF之样式与资源_第12张图片

在WPF中,通过Text="{x:Static prop:Resources.Password}"的方式,进行访问资源内容,示例如下:

浅谈WPF之样式与资源_第13张图片

 示例源码如下:​​​​​​​


    
        
            
            
            
        
        
            
            
        
        
        
        
        
        
    

资源字典

资源字典可以实现资源的共享,一份定义,多处使用的效果。具有可维护性,高效,适应性等优势

首先创建资源字典文件,通过程序右键--添加--资源字典,打开资源字典对话框,创建名称为OneDictionary.xaml,如下所示:

浅谈WPF之样式与资源_第14张图片

 资源字典中创建了五个资源,如下所示:


    酬乐天扬州初逢席上见赠
    【作者】刘禹锡 【朝代】唐
    巴山楚水凄凉地,二十三年弃置身。
    怀旧空吟闻笛赋,到乡翻似烂柯人。
    沉舟侧畔千帆过,病树前头万木春。
    今日听君歌一曲,暂凭杯酒长精神。

在对应窗口中,包含资源文件的路径即可,如下所示:


    
        
            
                
            
        
    
    
        
        
        
        
        
        
    

示例截图如下:

浅谈WPF之样式与资源_第15张图片

以上就是【浅谈WPF之样式与资源】的全部内容,关于更多详细内容,可参考官方文档。希望能够一起学习,共同进步。

你可能感兴趣的:(.Net技术,wpf,ui,样式,资源)