WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器

news2024/11/20 0:26:26

文章目录

  • 官方文档
  • 往期回顾
    • 零基础笔记
    • 项目实战(已完结)
  • 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLDP(链路层发现协议)详解及C/C++代码实现

LLDP&#xff08;链路层发现协议&#xff09;是一种IEEE标准协议&#xff08;IEEE 802.1AB&#xff09;&#xff0c;它定义了封装在以太网帧中的消息&#xff0c;目的是通过默认情况下每30秒从每个端口定期重传一次&#xff0c;为设备提供一种向LAN&#xff08;局域网&#xff…

20个Java编程技巧

1. 把字符串常量放在前面 通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个坏主意&#xff0c;就像这样&#xff1a; 这是毫无疑问的&#xff0c;把一种表达式转换成另一种更好的表达式&#xff0c;并不会失去什么。只要我…

mysql锁机制及MVCC底层原理

一、锁介绍 按性能可分为乐观锁&#xff08;适用于读多写少的情况下&#xff0c;如果是写多&#xff0c;导致过多cpu空转&#xff0c;影响性能&#xff09;和悲观锁&#xff08;适用于写多的情况&#xff09;按数据库操作粒度可分为表锁、页锁、行锁按数据库操作类型可分为读锁…

UE4/5动画系列(1.模板制作)

目录 动画模板制作 同步模板组制作 有模板做什么都方便&#xff0c;所以这里我们做一个动画蓝图的模板&#xff08;动物专用&#xff09; 动画模板制作 第一步创建一个动画蓝图的模板 然后找到第三人称的模板&#xff0c;将其模板的蓝图改名&#xff1a; 在动画蓝图的模板里…

团体程序设计天梯赛-练习集L2篇②

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

首个跨云元数据KV存储Xline正式进入CNCF沙箱

2023年6月13日&#xff0c;云原生计算基金会&#xff08;CNCF&#xff09;宣布Xline正式被纳入CNCF沙箱(Sandbox&#xff09;项目。Xline是由达坦科技&#xff08;DatenLord&#xff09;于2022年年底推出的开源项目&#xff0c;是一个用Rust语言写就的&#xff0c;用于元数据管…

hello算法笔记之图

一、图的基础知识 图是一种非线性数据结构&#xff0c;由「顶点 Vertex」和「边 Edge」组成。 1.图的类型&#xff1a; 根据边是否具有方向可以分为有向图&#xff0c;无向图 根据所有顶点是否连通可以分为连通图&#xff08;对于连通图&#xff0c;从某个顶点出发&#xf…

gdb系列-入门篇-day01

gdb基础命令 一个程序要被调试&#xff0c;编译的时候要加上-g选项&#xff0c;例如gcc -g … 先准备一个调试的小代码 #include <stdio.h>int hello() {printf("hello\n");return 0; }int main() {int a[5] {1,2,3,4,5};hello();for(int i0; i<5; i){pri…

springboot使用@Valid 和 @Validated 注解校验详解以及编写一个自定义全局异常类

package com.test.springvalid.config;import lombok.Data; import java.util.HashMap; import java.util.Map;/*** 通用返回结果&#xff0c;服务端响应的数据最终都会封装成此对象* param <T>*/ Data public class R<T> {private Integer code; //编码&#xff1…

Mybatis源码分析_Mapper接口是如何实例化的 (2)

我们在使用Springmybatis的时候&#xff0c;经常都是直接写一个接口和一个对应的 ***Mapper.xml文件&#xff0c;然后业务代码就可以直接注入这个接口了。它是如何做到的呢&#xff1f; 接口&#xff1a; xml 想搞清楚这个问题&#xff0c;那还是要从Mybatis底层源码进行分析的…

智能小车使用IIC屏幕做动作显示界面

一、简介 使用0.96寸IIC屏幕作为遥控动作的显示界面。 外设引脚 stm32f103c8t6单片机IIC引脚有两组 使用I2C1&#xff0c;对应的时钟与数据线分别为PB6、PB7。 IIC屏幕指令 // OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel // OLED_WR_Byte(0x00,OLED_CMD);//---se…

07- c语言指针 (C语言)

一 指针的引入 1、一般把内存中的一个字节称为一个内存单元。 2、为了正确地访问这些内存单元&#xff0c;必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址&#xff0c;通常也把这个地址称为指针。 3、如果在程序中定义…

车载网络测试 - CANCANFD - 基础篇_03

十、发送方式与过滤方式 1、广播发送及规则 我们以小组讨论现场为例来说明CAN总线广播发送规则&#xff1a; 1&#xff09;一个房间代表同一路CAN总线&#xff0c;每一个小组代表一个CAN Node&#xff0c;每一个小组成员发言代表发送一帧CAN报文&#xff0c;对所有的小组成员进…

生成对抗网络

1 GAN基本概念 1.1 GAN介绍 GAN的英文全称是Generative Adversarial Network&#xff0c;中文名是生成对抗网络。它由两个部分组成&#xff0c;生成器和鉴别器&#xff08;又称判别器&#xff09;&#xff0c;生成网络&#xff08;Generator&#xff09;负责生成模拟数据&…

【Python】异常处理 ④ ( 异常处理 else 语句 | 异常处理 finally 语句 )

文章目录 一、Python 异常捕获 else 语句1、异常捕获 else 语句2、代码示例 - 没有触发 else 语句的情况3、代码示例 - 触发 else 语句的情况 二、Python 异常捕获 finally 语句1、异常捕获 finally 语句2、代码示例 - 出现异常后执行 finally 语句 一、Python 异常捕获 else 语…

展示和标注图像:探索Gradio AnnotatedImage模块的功能

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

代码生成器原理分析

代码生成器原理分析 理解代码生成器的需求和实现思路掌握freemaker的使用 理解数据库中的元数据完成环境搭建工作 浅谈代码生成器 概述 在项目开发过程中&#xff0c;关注点更多是在业务功能的开发及保证业务流程的正确性上&#xff0c;对于重复性的代码编写占据了程 序员…

指标综合评价(定性指标定量化、指标正相关化、赋权重)

目录 一、定性指标定量化 二、将指标同型化 线性比例变换法 极差变换法 二、评价指标赋予权重 三、综合评价 战斗机性能的综合评价问题 例&#xff1a;战斗机的性能指标主要包括最大速度、飞行半径、最大负载、隐身性能、垂直起降性能、可靠性、灵敏度等指标和相关费用。…

Vue+Element UI 生鲜管理系统简介及项目搭建,页面布局(一)

文章目录 浅谈一、背景二、搭建创建vue项目vue项目结构简介安装Element UI库安装axios安装querystring安装normalize.css安装echarts运行删除无用组件基础css样式导入 三、页面布局配置路由布局flex布局&#xff08;弹性盒子&#xff09;固定布局固定布局配置路由 浅谈 自从入…

【Rust】2、实战:文件、网络、时间、进程-线程-容器、内核、信号-中断-异常

文章目录 七、文件和存储7.2 serde 与 bincode 序列化7.3 实现一个 hexdump7.4 操作文件7.4.1 打开文件7.4.2 用 std::fs::Path 交互 7.5 基于 append 模式实现 kv数据库7.5.1 kv 模型7.5.2 命令行接口 7.6 前端代码7.6.1 用条件编译定制要编译的内容 7.7 核心&#xff1a;LIBA…