mvvm框架搭建之---View中资源字典和控件关联的常见方式

一、说明

1)本文讲述wpf中控件的Style属性资源的自定义

2) wpf中的Style作用是为了设计多种外观形式和动作行为。构成Style的最重要的两种元素是setter和trigger。Setter类帮助我们设置控件的静态外观风格,Trigger类则帮助我们设置控件的行为风格。

3)控件的Style属性资源一般有属性、方法、事件类

4)定义好控件的Style属性资源后,在窗体资源字典中声明,然后可以绑定到Xaml中具体的控件

二、使用方法

1)方式1:Style中Setter的使用:首先在Windows的资源字典中放置一个针对某类控件(比如TextBlock)的Style,Style中再用若干Setter来设置TextBlock的一些属性,这样程序中的TextBlock就会拥有统一的风格,除非在某个TextBlock控件中用{x:null}清空它的style样式。
a)设置资源 :   (x:代表当前文件类。 设置textBlock文本的字体)

       <Style x:Key="txtBlockStyle" TargetType="TextBlock">
            <Style.Setters>
                <Setter Property="FontSize" Value="18"></Setter>
                <Setter Property="FontWeight" Value="Bold"></Setter>
            </Style.Setters>
        </Style>
      <Style x:Key="txtBlockStyle" TargetType="{x:Type TextBox}">
            <Style.Setters>
                <Setter Property="FontSize" Value="18"></Setter>
                <Setter Property="FontWeight" Value="Bold"></Setter>
            </Style.Setters>
        </Style>

b)设置控件Style:默认为资源字典中的风格。

 <TextBlock Text="悄悄的我走了" x:Name="txtBlock1" Width="150" Height="25" TextAlignment="Left" Canvas.Left="20" Canvas.Top="10" Style="{DynamicResource txtBlockStyle}"></TextBlock>
 <TextBlock Text="正如我悄悄的来" x:Name="txtBlock2" Width="150" Height="25" TextAlignment="Center" Canvas.Left="160" Canvas.Top="10" Style="{x:null}" ></TextBlock>

c) Setter设置器,Setter类的Property属性用来指明为目标的哪个属性赋值,Setter类的Value属性则是提供的属性值

2)Style中的Trigger:当满足条件会触发一个行为,比较像事件,一般是由用户操作触发的。触发器有事件型的触发器EventTrigger、数据变化触发型的Trigger/DataTrigger、多条件触发型的MultiTrigger/MultiDataTrigger等。Style中Trigger触发器的使用:首先在Windows的资源字典(Windows.Resources)中放置一个针对某类控件(比如checkbox)的style,运用Style.Trigger类中的Property、Value、Setter属性,在控件的某些属性值满足条件时,设置其他的属性行为值,这样程序中的这类控件就拥有统一的行为风格。

a) Trigger类也有Property和Value两个属性,Property是关注的的属性名称,Value是触发条件。Trigger类还有一个Setters属性,此属性值是一组Setter,触发条件满足时,这组Setter的"属性--值"就会被应用。

b)鼠标移动到Label控件和离开Label控件,触发字体变化事件

  <Style TargetType="Label" x:Key="labelStyle">
            <Style.Triggers>
                <EventTrigger RoutedEvent="MouseEnter">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="FontSize" To="18"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>

                <EventTrigger RoutedEvent="MouseLeave">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="FontSize" To="13"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
        </Style>

c) CheckBox控件选中和鼠标移动到对应内容上后,触发事件字体颜色改变

    <Style TargetType="CheckBox" x:Key="checkboxStyle">
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="FontSize"  Value="20"></Setter>
                    <Setter Property="Foreground" Value="OrangeRed"></Setter>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="FontSize" Value="20"></Setter>
                    <Setter Property="Foreground" Value="Green"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>

d) MultiTigger必须多个条件同时成立时才会被触发。MultiTrigger比Trigger多了个Conditions属性,需要同时成立的条件就存储在这个集合中。当鼠标停留在该控件上,且光标处于focus状态时触发事件。

 <Style TargetType="TextBox" x:Key="txtBoxMultiTriggerStyle">
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="true"></Condition>
                        <Condition Property="IsFocused" Value="true"></Condition>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" Value="GreenYellow"></Setter>
                    <Setter Property="BorderThickness"  Value="2"></Setter>
                </MultiTrigger>
            </Style.Triggers>
        </Style>

e) DataTrigger数据触发。DataTrigger对象的Binding属性会把数据传送过来,值与属性一致时,DataTrigger即被触发。首先在View引用转换函数Converter的命名空间,然后在DataTrigger中绑定对象的相关属性,转换器绑定到本地定义的转换函数,value属性值设置为当转换函数返回值一致时期望触发的值。最后Setter类设置触发后相关属性的值得改变。

  *ConvertViewModel.cs 转换方法代码:

    public class ConverterViewModel : IValueConverter, INotifyPropertyChanged, System.Collections.Specialized.INotifyCollectionChanged
    {
        //
        // 摘要:
        //     转换值。
        //
        // 参数:
        //   value:
        //     绑定源生成的值。
        //
        //   targetType:
        //     绑定目标属性的类型。
        //
        //   parameter:
        //     要使用的转换器参数。
        //
        //   culture:
        //     要用在转换器中的区域性。
        //
        // 返回结果:
        //     转换后的值。 如果该方法返回 null,则使用有效的 null 值。

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int length = (int)value.ToString().Length;
            return length > 6 ? true : false;
        }
}

 *View的UI代码:textBlock控件中输入字符串的长度小于6则控件边框变粗,为红色

    <local1:ConverterViewModel x:Key="L2Bconver"></local1:ConverterViewModel>

        <Style TargetType="{x:Type TextBox}" x:Key="txtBoxStyle">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=Text,Converter={StaticResource L2Bconver}}" Value="false">
                    <Setter Property="BorderBrush" Value="Red"></Setter>
                    <Setter Property="BorderThickness" Value="3"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>

三 总结

     WPF控件的Style属性可以设计控件的静态(外观)和动态(动作方法)属性,通过设定的属性值满足条件来改变其它属性,控件属性设计方便,只需编辑View中的代码。

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的大学生第二课堂系统,旨在为大学生提供一个便捷、高效的学习和实践平台。项目包含了完整的数据库设计、后端Java代码实现以及前端Vue.js页面展示,适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 在功能方面,系统主要实现了以下几个模块:用户管理、课程管理、活动管理、成绩管理和通知公告。用户管理模块支持学生和教师的注册、登录及权限管理;课程管理模块允许教师上传课程资料、设置课程时间,并由学生进行选课;活动管理模块提供了活动发布、报名和签到功能,鼓励学生参与课外实践活动;成绩管理模块则用于记录和查询学生的课程成绩和活动参与情况;通知公告模块则实时发布学校或班级的最新通知和公告。 技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,确保了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提升了用户体验和开发效率。 该项目不仅提供了完整的源代码和相关文档,还包括了详细的数据库设计文档和项目部署指南,为学习和实践提供了便利。对于基础较好的学习者,可以根据自己的需求在此基础上进行功能扩展和优化,进一步提升自己的技术水平和项目实战能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值