文章目录
- 官方文档
- 往期回顾
- 零基础笔记
- 项目实战(已完结)
 
- WPF项目创建
- 为什么选net core版本
 
- WPF 静态页面
- WPF 页面布局
- WPF样式
- Style样式
- 行内样式
- 行外样式
- 如果是简单样式,可以这么写
- 如果是复杂样式
 
- WPF样式继承
- WPF触发器
- 单条件触发器
- 多条件触发
 
 
 
官方文档
往期回顾
零基础笔记
WPF 零基础入门笔记(0):WPF简介
项目实战(已完结)
WPF MaterialDesign 初学项目实战(0):github 项目Demo运行
 WPF MaterialDesign 初学项目实战(1)首页搭建
 WPF MaterialDesign 初学项目实战(2)首页导航栏样式
 WPF MaterialDesign 初学项目实战(3)动态侧边栏
 WPF MaterialDesign 初学项目实战(4)侧边栏路由管理
 WPF MaterialDesign 初学项目实战(5):设计首页
 WPF MaterialDesign 初学项目实战(6):设计首页(2),设置样式触发器。已完结
WPF项目创建
我们这里选择.net core版本的WPF


 
为什么选net core版本
.NET core是以后.NET 发展的方向。
 .NET core 特点
- 微软主推的方向,.NET framework目前只有维护性更新
- 跨平台,虽然WPF不能跨平台,但是你以后写MAUI,控制台程序,WEBAPI,都可以在Linux端运行。跨平台主要就是跨linux,方便项目部署。
- 配套的生态都已经从NET Framework 迁移过来了。
- 你都选择WPF而不是 winform,那顺便多学一点呗
WPF 静态页面
如果学过web端,我这里就拿Web端来进行比较。
 web包含:html,css,JS。
- html:声明有什么元素
- CSS:让界面更加好看
- JS:页面逻辑代码
在WPF中,分离会更加彻底。WPF包含Xmal和C#。
- Xmal:声明元素,声明样式,负责交互逻辑 
  - 对应Web端的 Html+CSS+简单页面交互
 
- C#:复杂页面交互和业务逻辑
控件我就略过了,没什么好说的,就是按钮,文本,输入框。参数自己去了解一下。不占用太多篇幅
比如Button类
 WPF Button
 但是我只能说,微软的文档写的一坨狗屎,第一我查不到WPF专门的
WPF 页面布局
我之前写过,就不重复写了。
WPF:WPF原生布局说明
WPF样式
我们输入
        <Style>
			<S   //出现提示
        </Style>

 这里我们可以看到有好几种样式
- Style.Setters 
  - Style样式:类似于CSS,用于设置页面的形象
 
- Style.Tirggers 
  - 触发器,用于设置简单的交互
 
- Sytle.Resource 
  - 资源,没怎么用过
 
Style样式
如果安装CSS的方式来说,WPF分为行内样式和行外样式
效果,生成如下图片

行内样式
<Rectangle Width="200"
                   Height="160"
                   Stroke="Blue">
            <Rectangle.Fill>
                <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">//使用行内标签来对代码进行优化
                    <LinearGradientBrush.GradientStops>
                        <GradientStop Offset="0.2"
                                      Color="LightBlue" />
                        <GradientStop Offset="0.7"
                                      Color="DarkBlue" />
                        <GradientStop Offset="1.0"
                                      Color="LightBlue" />
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
行外样式
如果是简单样式,可以这么写
        <Style x:Key="MyButton"
               TargetType="Button">
            <Style.Setters>
                <Setter Property="Content"
                        Value="" />
            </Style.Setters>
        </Style>
如果是复杂样式
 <Window.Resources>
        <!--x:Key为样式的名称,TargetType是样式生效的目标-->
        <Style x:Key="MyRectFill" TargetType="Rectangle">
        <!--Style是样式设置-->
            <Style.Setters>
            <!--设置Recangle的Fill属性。使用Property=属性,Value=值的形式-->
                <Setter Property="Fill" >
                    <Setter.Value><!--对应的样式属性,如果Value是简单字符串,可以不展开-->
                        <LinearGradientBrush StartPoint="0,0"
                                             EndPoint="1,1">
                            <GradientStop Offset="0.2"
                                          Color="LightBlue" />
                            <GradientStop Offset="0.7"
                                          Color="DarkBlue" />
                            <GradientStop Offset="1.0"
                                          Color="LightBlue" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
        </Style>
    </Window.Resources>
    <Grid>
        <Rectangle Width="200"
                   Height="160"
                   Stroke="Blue" Style="{StaticResource MyRectFill}" >
        </Rectangle>
    </Grid>
WPF样式继承
一个简单的按钮
    <Window.Resources>
        <Style x:Key="MyButton"
               TargetType="Button">
            <Style.Setters>
                <Setter Property="Content"
                        Value="按钮" />
                <Setter Property="Width" Value="100"/>
                <Setter Property="Height" Value="30"/>
            </Style.Setters>
        </Style>
    </Window.Resources>
    <Grid>
        <Button  Style="{StaticResource MyButton}"/>
    </Grid>

 <Window.Resources>
        <Style x:Key="MyButton"
               TargetType="Button">
            <Style.Setters>
                <Setter Property="Content"
                        Value="按钮" />
                <Setter Property="Width" Value="100"/>
                <Setter Property="Height" Value="30"/>
            </Style.Setters>
        </Style>
        <!--使用继承,继承MyButton-->
        <Style x:Key="MyButton2" BasedOn="{StaticResource MyButton}"  TargetType="Button">
            <Style.Setters >
                <Setter Property="Background"
                        Value="Yellow" />
                <Setter Property="BorderBrush" Value="Red"/>
            </Style.Setters>
        </Style>
    </Window.Resources>
    <Grid>
        <Button  Style="{StaticResource MyButton2}"/>
    </Grid>
效果

WPF触发器
WPF触发器用于简单的交互逻辑
 WPF为了实现业务和界面逻辑尽可能的分离,在Xmal中可以实现简单的交互逻辑和页面元素沟通。而简单的交互逻辑就是通过WPF触发器来实现的
单条件触发器
这里设计一个简单的触发器,通过鼠标悬停事件来进行区分。
 <Window.Resources>
        <Style x:Key="MyButton" TargetType="Button">
            <!--设置触发器-->
            <Style.Triggers>
                <!--当鼠标停留属性为Ture时-->
                <Trigger Property="IsMouseOver"
                         Value="True">
                    <Setter Property="Foreground"
                            Value="Red" />
                    <Setter Property="FontSize"
                            Value="30" />
                </Trigger>
                <!--当鼠标停留事件为False时-->
                <Trigger Property="IsMouseOver"
                         Value="False">
                    <Setter Property="Foreground"
                            Value="Blue" />
                    <Setter Property="FontSize"
                            Value="20" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Width="100"
                Height="50"
                Content="按钮"
                Style="{StaticResource MyButton}" />
    </Grid>
实现效果

多条件触发
<Window.Resources>
        <Style x:Key="MyButton" TargetType="Button">
            <!--设置触发器-->
            <Style.Triggers>
                <!--多条件触发-->
                <MultiTrigger>
                    <!--当鼠标悬停+鼠标点击时,字体颜色变红-->
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver"
                                   Value="True" />
                        <Condition Property="IsFocused"
                                   Value="True" />
                    </MultiTrigger.Conditions>
                    <MultiTrigger.Setters>
                        <Setter Property="Foreground" Value="Red"/>
                    </MultiTrigger.Setters>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Width="100"
                Height="50"
                Content="按钮"
                Style="{StaticResource MyButton}" />
    </Grid>


















