高级桌面编程(一)

news2024/11/27 10:43:44

前言

     学习心得: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"  设置开始动画的时间。 

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

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

相关文章

OpenCV技术应用(8)— 如何将视频分解

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成热力图&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 视频是…

蚂蚁SEO强引蜘蛛是什么

强引蜘蛛在网页中是指一些特殊类型的网页&#xff0c;这些网页具有极高的吸引力和价值&#xff0c;能够吸引搜索引擎蜘蛛&#xff08;Spider&#xff09;的强烈关注和抓取。强引蜘蛛的网页通常具有以下特点&#xff1a; 如何联系蚂蚁seo&#xff1f; baidu搜索&#xff1a;如…

C++ Qt开发:ComboBox下拉组合框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ComboBox下拉组合框组件的常用方法及灵活运用…

概率论复习

第一章&#xff1a;随机概率及其概率 A和B相容就是 AB 空集 全概率公式与贝叶斯公式&#xff1a; 伯努利求概率&#xff1a; 第二章&#xff1a;一维随机变量及其分布&#xff1a; 离散型随机变量求分布律&#xff1a; 利用常规离散性分布求概率&#xff1a; 连续性随机变量…

Unity 如何通过2D Sprite切割一张图为多张

1、理解 在一些2D游戏开发中&#xff0c;我们常常使用2D Sprite把一张大图切割成多个小图使用。 这样做有不少好处&#xff0c;首先&#xff0c;通过精准使用小图&#xff0c;能够一定程度上节省内存&#xff0c;提高渲染性能。 其次把同类的小图做成一张大图在切割使用会更…

强大的数学软件 GeoGebra 多平台适用

GeoGebra 是一款教育数学软件&#xff0c;可以帮助学生和教师探索、学习和教授各种数学概念和科学领域的知识。GeoGebra 以其灵活性和强大的功能而闻名&#xff0c;它融合了几何、代数、微积分、概率、统计和其他数学领域的工具&#xff0c;以及绘图和计算功能。 功能 GeoGeb…

深度学习项目实战:垃圾分类系统

简介&#xff1a; 今天开启深度学习另一板块。就是计算机视觉方向&#xff0c;这里主要讨论图像分类任务–垃圾分类系统。其实这个项目早在19年的时候&#xff0c;我就写好了一个版本了。之前使用的是python搭建深度学习网络&#xff0c;然后前后端交互的采用的是java spring …

【开源】基于Vue和SpringBoot的天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

详解—【C++】lambda表达式

目录 前言 一、lambda表达式 二、lambda表达式语法 2.1. lambda表达式各部分说明 2.2. 捕获列表说明 三、函数对象与lambda表达式 前言 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。 #include <algorithm> #i…

mysql函数(三)之常见数学函数

MySQL提供了很多常用的数学函数&#xff0c;常见的数学函数及使用如下&#xff1a; ABS(X)&#xff1a;返回X的绝对值。 例子&#xff1a;SELECT ABS(-5); – 结果为5 效果图&#xff1a; CEIL(X)&#xff1a;返回大于或等于X的最小整数值。 例子&#xff1a;SELECT CEIL(3.2…

13603个字彻底弄清linux

13603个字彻底弄清linux 关键命令说明 系统关机命令linux查看文本的指令mountdmesggrepfindlsusblsof linux软件开发知识点 linux进程间通讯方式内存申请函数gcc编译过程文件系统硬链接和软连接linux内核子系统进程几种状态文件系统组成linux文件类型linux常用的系统调用函数f…

MidJourney笔记(8)-ask和blend命令

经过前面的课程介绍,我相信大家对MidJourney有一定的认识,接下来就给大家介绍一下MidJourney的常用命令。 /ask 获取问题答案。 我一开始以为是随便问题都可以问,最后发现只能回答MidJourney相关的问题。 我们先试试一些日常生活问题: 今天天气如何? 以为它不会识别中文,…

基于Levenberg-Marquardt算法改进的BP神经网络-公式推导及应用

Levenberg-Marquardt算法是一种用于非线性最小化问题的优化算法&#xff0c;通常用于训练神经网络。它结合了梯度下降和高斯-牛顿方法的特点&#xff0c;旨在提高收敛速度和稳定性。下面是基于Levenberg-Marquardt算法改进的反向传播&#xff08;BP&#xff09;神经网络的详细推…

【vtkWidgetRepresentation】第十四期 二维标注

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtk中的二维标注,主要用于医学领域,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 1. vtkBiDimension…

智能优化算法应用:基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于吉萨金字塔建造算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.吉萨金字塔建造算法4.实验参…

程序人生,由“小作文”事件想到的

时势造英雄。自媒体时代&#xff0c;火出圈是靠大众的审美和爱好&#xff0c;自己能做的关键&#xff0c;其实是做好自己&#xff0c;选择向上生长&#xff0c;持续不断的读书、学习。同时保持一份好奇心&#xff0c;培养一个兴趣爱好并自得其乐。 展示自我 回想起我小时候&am…

【Image】图像处理

计算机视觉 CV Perception 如自动驾驶领域。 只要是从所谓的图像当中去抽取信息的过程&#xff0c;我们都叫做Perception。 视觉检测可以涵盖二维检测&#xff0c;如车辆、人和信号灯的检测。另外&#xff0c;还可以控制三维信息&#xff0c;直接在三维空间中操作数据。 SL…

Excel 如何把一句话里的特定字标记颜色

方案&#xff1a; 借助Work功能 诉求&#xff1a;把如下Excel内容里所有的天标记为红色 第一步&#xff1a;复制到World里 第二步&#xff1a; CtrlH 然后如图执行替换 第3步&#xff1a;World 复制会 Excel

第8次实验:UDP

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

如何免费搭建私人电影网站(一)

前言&#xff1a;在线看电影经常会出现烦人的广告&#xff0c;为了不浪费时间看广告&#xff0c;有必要做自己的专属网站。 准备工作&#xff1a; 1、申请免费域名&#xff08;也可以花钱注册域名相对稳定&#xff09;链接: 申请免费域名方法 2、申请免费主机&#xff08;也可以…