高级桌面编程(一)

前言

     学习心得:C# 入门经典第8版书中的第15章《高级桌面编程》

创建控件并设置样式

1 样式 Style

        WPF 当中我们可以对每一个控件进行完全的自定义。我们可以随意更改控件外观和功能。提供我们能完成这样的效果与控件的样式(Style)有着不可分割的关系。

使用Style

        我们每一个控件都可以对其样式进行自定义。我们称为为其定义一个Style。Style我们称为有着以下常规定义顺序。1 先指定当前的Style所定义的目标类型 (TargetType属性,以便解析目标属性)2 指定想定义的属性 setter 在根据Property指定设置的属性 最后通过Value 指明其属性的值。

举个例子:

<Style x:Key="DefinitionButtonStyle" TargetType="Button">
    <Setter Property="Background">
        <Setter.Value>
            <SolidColorBrush Color="Red" />
        </Setter.Value>
    </Setter>
</Style>

示例解释:

        我在这定义了一个Button的Style 当前的样式仅仅只对背景颜色进行了指定为红色。虽然这里可以直接使用属性进行赋值但是要注意Style 的最主要的优势在于它可以重复使用。意思就是我们可以通过简单的代码指定一部或者是大部分的一个样式指定。我们就不需要写重复代码  (将Style转换为资源后引用既可以重复使用)

使用示例:

  <Button MinHeight="20" Style="{StaticResource DefinitionButtonStyle}" />

提示:当前的示例很简单,但它能进行很复杂的设置。 

2 模板 Template

         模板其实是被包含在Style中的,所谓模板就是控件的显示内容的呈现方式。定义模板既要对控件的Template进行设置。Template是ControlTemplate(内容模板)的实例。ControlTemplate 包含 TargetType 属性与Style的TargetType效果一致,都是指定目标类型 以解析目标属性。ControlTemple中包含一个ContentPresenter控件  你可以在内容输出的时候都包容一个这个控件。

举个例子:

 <Style x:Key="DefinitionButtonStyle" TargetType="Button">
     <Setter Property="Background" Value="Red" />
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="{x:Type Button}">
                 <StackPanel Margin="{TemplateBinding Margin}">
                     <Image Cursor="{TemplateBinding Cursor}" Source="C:\Users\Administrator\Desktop\image2\1.jpg" />
                     <Button
                         Width="{TemplateBinding Width}"
                         Height="{TemplateBinding Height}"
                         Content="{TemplateBinding Content}"
                         Cursor="AppStarting" />
                 </StackPanel>
             </ControlTemplate>
         </Setter.Value>
     </Setter>
 </Style>

示例解释:在示例当中我们定义了一个Button的样式其中主要对他的控件模板进行了一个自定义我们在控件模板当中定义了一个StackPanel 定义了一一了一个image在定义了一个Button按钮其中定义的顺序是常见的且基本固定。先设置其ControlTemplate  属性再给其属性赋值然后再对ControlTemplate 显示模板进行一个定。其中显示模板当中我们可以采用使用ContentPresenter 控件或者直接自定义控件然后通过绑定上父类给上的属性值。  

使用示例:

 <Grid>
     <StackPanel VerticalAlignment="Center">
         <Button
             Width="120"
             Height="120"
             MinHeight="20"
             Content="内容"
             Cursor="Hand"
             Style="{StaticResource DefinitionButtonStyle}" />

     </StackPanel>
 </Grid>

运行效果: 

3 创建资源字典

在创建的资源字典中添加(刚刚定义的样式)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="DefinitionButtonStyle" TargetType="Button">
        <Setter Property="Background" Value="Red" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <StackPanel Margin="{TemplateBinding Margin}">
                        <Image Cursor="{TemplateBinding Cursor}" Source="C:\Users\Administrator\Desktop\image2\1.jpg" />
                        <Button
                            Width="{TemplateBinding Width}"
                            Height="{TemplateBinding Height}"
                            Content="{TemplateBinding Content}"
                            Cursor="AppStarting" />
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

在WIndows的资源中定义一个资源字典指定当前资源所在位置

  <Window.Resources>
      <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
              <ResourceDictionary Source="Dictionary1.xaml" />
          </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
  </Window.Resources>

上述我们就完成了一个资源字典的定义。

触发器

        触发器如其名满足某某条件触发某某事件。同样我们也可以在Style中定义。我们有很多类型的事件如EventTrigger、DataTrigger、MultiTrigger、PropertyTrigge。这几种触发器。

        其中拿EventTrigger举例我们就能通过调用BeginStoryboard触发动画、 Storyboard 触发故事集、 soundplayaction 来触发音效。

举个例子:

 <Window.Resources>
     <Style x:Key="Mytriggrs" TargetType="Button">
         <Style.Triggers>
             <Trigger Property="IsMouseOver" Value="True">
                 <Setter Property="BorderThickness" Value="10" />
                 <Setter Property="BorderBrush" Value="Tan" />
             </Trigger>
         </Style.Triggers>
     </Style>
 </Window.Resources>

示例解释:每当鼠标悬浮在Button控件上,它将会改变控件的边框大小以及边框颜色  (PropertyTrigge 事件触发器,后续动画会提到EventTrigger 触发器)

使用方式:

   <Grid>
       <StackPanel VerticalAlignment="Center">
           <Button
               Width="120"
               Height="120"
               MinHeight="20"
               Content="内容"
               Cursor="Hand"
               Style="{StaticResource Mytriggrs}" />
       </StackPanel>
   </Grid>

运行效果:

动画 

 动画其实挺复杂但是我这里只讲一个大概。我们这里对按钮的宽度进行一个动画设置。

举个例子:

  <Window.Resources>
      <Style x:Key="Mytriggrs" TargetType="Button">
          <Style.Triggers>
              <EventTrigger RoutedEvent="Button.MouseEnter">
                  <BeginStoryboard>
                      <Storyboard>
                          <DoubleAnimation
                              FillBehavior="HoldEnd"
                              Storyboard.TargetProperty="Height"
                              From="120"
                              To="20"
                              Duration="0:0:0.5" />

                          <DoubleAnimation
                              Storyboard.TargetProperty="Opacity"
                              From="0"
                              To="1"
                              Duration="0:0:0.5" />
                      </Storyboard>
                  </BeginStoryboard>
              </EventTrigger>
              <EventTrigger RoutedEvent="Button.MouseLeave">
                  <BeginStoryboard>
                      <Storyboard>
                          <DoubleAnimation
                              FillBehavior="HoldEnd"
                              Storyboard.TargetProperty="Height"
                              From="20"
                              To="120"
                              Duration="0:0:0.5" />

                          <DoubleAnimation
                              Storyboard.TargetProperty="Opacity"
                              From="1"
                              To="0.1"
                              Duration="0:0:0.5" />
                      </Storyboard>
                  </BeginStoryboard>
              </EventTrigger>
              <EventTrigger RoutedEvent="Button.Click">
                  <BeginStoryboard>
                      <Storyboard>
                          <ColorAnimation
                              FillBehavior="HoldEnd"
                              Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
                              To="Black"
                              Duration="0:0:0.5" />
                      </Storyboard>
                  </BeginStoryboard>
              </EventTrigger>
          </Style.Triggers>
      </Style>
  </Window.Resources>

示例解释:这里写了三个触发器。其中前面两个分别是在鼠标进入的时候给我们控件的高度以及透明度进行一个动画。在鼠标离开的时候给我们的控件的高度和透明度进行一个还原。最下面的这个我们对控件的颜色进行了一个动画处理由原来的颜色渐渐地转为黑色   RoutedEvent 触发的事件名称   FillBehavior 动画介绍后是否还原原状   Storyboard.TargetProperty 设置的属性 From 开始值 To 结束值。 Duration动画时间 0时 0分 0.5秒 以及没有用到的属性   BeginTime="0:0:5"  设置开始动画的时间。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何实现TensorFlow自定义算子?

在上一篇文章中 Embedding压缩之基于二进制码的Hash Embedding&#xff0c;提供了二进制码的tensorflow算子源码&#xff0c;那就顺便来讲下tensorflow自定义算子的完整实现过程。 前言 制作过程基于tensorflow官方的custom-op仓库以及官网教程&#xff0c;并且在Ubuntu和Mac…

第8次实验:UDP

目的&#xff1a; 来看一下UDP&#xff08;用户数据报协议&#xff09;的细节。UDP是整个互联网上使用的一种传输协议。在不需要可靠性的情况下&#xff0c;作为TCP的替代品在互联网上使用。它在你的课文的第6.4节中有所涉及。在做这个实验之前&#xff0c;先复习一下这一部分 …

【精选】计算机网络教程(第7章网络安全)

目录 前言 第7章网络安全 1、公钥 2、私钥 3、数字签名 前言 总结计算机网络教程课程期末必记知识点。 第7章网络安全 1、公私密钥和对称密钥 公私密钥&#xff08;或非对称密钥&#xff09;和对称密钥是在密码学中用于加密和解密数据的两种不同的密钥类型。 公私密钥…

MySQL主从复制详解

目录 1. 主从复制的工作原理 1.1. 主从复制的角色 1.2. 主从复制的流程 2. 配置MySQL主从复制 2.1. 确保主服务器开启二进制日志 2.2. 设置从服务器 2.3. 连接主从服务器 2.4. 启动复制 3. 主从复制的优化与注意事项 3.1. 优化复制性能 3.2. 注意复制延迟 3.3. 处理…

Leetcode 376 摆动序列

题意理解&#xff1a; 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 如果是摆动序列&#xff0c;前后差值呈正负交替出现 为保证摆动序列尽可能的长&#xff0c;我们可以尽可能的保留峰值&#xff0c;&#xff0c;删除上下坡的中间值&…

2023.12.17 关于 Redis 的特性和应用场景

目录 引言 Redis 特性 内存中存储数据 可编程性 可扩展性 持久化 支持集群 高可用性 Redis 优势 Redis 用作数据库 Redis 相较于 MySQL 优势 Redis 相较于 MySQL 劣势 Redis 用作缓存 典型场景 Redis 存储 session 信息 Redis 用作消息队列 初心 消息队列的…

redis之五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存&#xff0c;并且所有的key都是字符串&#xff0c;所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是&#xff1a;String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型&#xff0c;v…

175. 电路维修(BFS,双端队列)

175. 电路维修 - AcWing题库 达达是来自异世界的魔女&#xff0c;她在漫无目的地四处漂流的时候&#xff0c;遇到了善良的少女翰翰&#xff0c;从而被收留在地球上。 翰翰的家里有一辆飞行车。 有一天飞行车的电路板突然出现了故障&#xff0c;导致无法启动。 电路板的整体…

保姆级 Keras 实现 YOLO v3 二

保姆级 Keras 实现 YOLO v3 二 一. 数据准备二. 从 xml 或者 json 文件中读出标注信息三. K-Means 计算 anchor box 聚类尺寸读出所有标注框尺寸K-Means 聚类 四. 代码下载 上一篇 文章中, 我们完成了 YOLO v3 的网络定义, 相当于完成了前向计算功能, 但此时网络中的参数处于随…

MySQL数据库 函数

目录 函数概述 字符串函数 数值函数 日期函数 流程函数 函数概述 函数是指一段可以直接被另一段程序调用的程序或代码。也就意味着&#xff0c;这一段程序或代码在MysQL中已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即…

前后端传参中遇见的问题

前后端传参经常容易出错&#xff0c;本文记录开发springBootMybatis-plusvuecli项目中出现的传参问题及解决办法 1.前后端没有跨域配置&#xff0c;报错 解决方法&#xff1a;后端进行跨域配置&#xff0c;拷贝CorsConfig类 package com.example.xxxx.config;import org.spr…

k8s-ingress 8

ExternalName类型 当集群外的资源往集群内迁移时&#xff0c;地址并不稳定&#xff0c;访问域名或者访问方式等会产生变化&#xff1b; 使用svc的方式来做可以保证不会改变&#xff1a;内部直接访问svc&#xff1b;外部会在dns上加上解析&#xff0c;以确保访问到外部地址。 …

2024年软件测试入坑指南,新人必看系列

本科非计算机专业&#xff0c;在深圳做了四年软件测试工作&#xff0c;从之前的一脸懵的点点点&#xff0c;到现在会点自动化测试&#xff0c;说一点点非计算机专业人员从事软件测试的心得体会&#xff0c;仅供参考交流。 如果你是非计算机专业&#xff0c;毕业不久&#xff0…

CMOS电源稳压器LDO

一、基本概述 TX6213是一款300mA Low Power LDO&#xff0c;输入电压2.5V~6.5V&#xff0c;输出范围1.0V~3.3V&#xff0c;输出电流300mA&#xff0c;PSRR为75dB 1KHz&#xff0c;压差为220mV IOUT200mA。 二、应用场景 MP3/MP4 Players Cellphones, radiophone, digital ca…

智能优化算法应用:基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.适应度相关算法4.实验参数设定5.算法…

C++设计模式-Builder 构建器

通过“对象创建” 模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 一、动机 在软件系统中&#xff0c;有时候面临着“一个复…

Python:(Sentinel-1)如何解析SNAP输出的HDF5文件并输出为GeoTIFF?

博客已同步微信公众号&#xff1a;GIS茄子&#xff1b;若博客出现纰漏或有更多问题交流欢迎关注GIS茄子&#xff0c;或者邮箱联系(推荐-见主页). Python&#xff1a;&#xff08;Sentinel-1&#xff09;如何解析SNAP输出的HDF5文件并输出为GeoTIFF&#xff1f; 01 前言 最近…

MySQL安装——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

MySQLhttps://www.mysql.com/ 将下发的ds_db01.sql数据库文件放置mysql中 12、编写Scala代码&#xff0c;使用Spark将MySQL的ds_db01库中表user_info的全量数据抽取到Hive的ods库中表user_info。字段名称、类型不变&#xff0c;同时添加静态分区&#xff0c;分区字段为etl_da…

TCP单人聊天

TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式&#xff0c;也有着优点和缺点 它的优点对比于UDP来说就是可靠一点 因为它的通讯方式是需…

谈谈你知道的设计模式?请手动实现单例模式 , Spring 等框架中使用了哪些模式?

文章目录 谈谈你知道的设计模式请手动实现单例模式Spring等框架中使用哪些设计模式&#xff1f;设计模式分类 谈谈你知道的设计模式 我们知道 InputStream 是一个抽象类&#xff0c;标准类库中提供了 FileInputStream、ByteArrayInputStream 等各种不同的子类&#xff0c;分别…