高级桌面编程(二)

一、前言

文章的续作前文是:

高级桌面编程(一)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/135072204?spm=1001.2014.3001.5502

二、自定义控件

1创建自定义控件,如下图所示:

2 在创建的页面可以自定义其控件外观。

举个例子:

<UserControl
    x:Class="WpfApp1.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Name="User"
    Width="100"
    Height="100"
    mc:Ignorable="d">
    <UserControl.Resources>
        <!--  在这里添加您需要用到的引用  -->
    </UserControl.Resources>
    <Canvas>
        <Rectangle
            Width="100"
            Height="100"
            RadiusX="12.5"
            RadiusY="12.5">
            <Rectangle.Fill>
                <LinearGradientBrush StartPoint="1,-1.68" EndPoint="0,1">
                    <GradientStop Offset="0" Color="#FFBEAF57" />
                    <GradientStop Offset="1" Color="#FFFFFFFF" />
                </LinearGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
        <Image
            Canvas.Left="14"
            Canvas.Top="5"
            Width="76"
            Height="59"
            Source="{Binding ElementName=User, Path=Imagestr}" />
        <TextBlock
            Canvas.Left="50"
            Canvas.Top="68"
            HorizontalAlignment="Center"
            VerticalAlignment="Top"
            FontSize="20"
            Text="{Binding ElementName=User, Path=YouName}"
            TextAlignment="Center"
            TextWrapping="Wrap" />
    </Canvas>
</UserControl>

使用方式:

<Window
    x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    xmlns:loc="clr-namespace:WpfApp1"
    Width="643"
    Height="384"
    BorderThickness="0"
    mc:Ignorable="d">
    <Grid>
        <loc:UserControl1 Imagestr="C:\Users\Administrator\Desktop\image\2 (4).jpg" YouName="龙"/>
    </Grid>
</Window>

注意: 创造依赖属性必须通过 DependencyProperty.Register静态的方法来配置属性。

1 DependencyProperty.Register静态方法介绍

        具有3-5个参数的重载。前面三个参数分别:属性名称、属性的类型、包含属性的类的类型。后面参数。PropertyMetadata类型 它可以提供属性的默认值以及值更新后触发的回调。

举个例子:

 public string YouName
 {
     get { return (string)GetValue(YouNameProperty); }
     set { SetValue(YouNameProperty, value); }
 }
 public static readonly DependencyProperty YouNameProperty =
     DependencyProperty.Register(
         "YouName", 
         typeof(string), 
         typeof(UserControl1),
         new PropertyMetadata ("",Onel)
       );

 private static void Onel(DependencyObject d, DependencyPropertyChangedEventArgs e)
 {
     //值更新触发当前方法
 }

ValidateValueCallback类型的参数为验证值的回调方法。

举个例子:

   public string YouName
   {
       get { return (string)GetValue(YouNameProperty); }
       set { SetValue(YouNameProperty, value); }
   }

   public static readonly DependencyProperty YouNameProperty =
       DependencyProperty.Register(
           "YouName", 
           typeof(string), 
           typeof(UserControl1),
           new PropertyMetadata ("",Onel),
           new ValidateValueCallback(Check));
   private static bool Check(object value)
   {
       //判断的业务代码
       return false; //代表当前值无效
   }

   private static void Onel(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {

   }

提示:并非一定要创建属性来获取依赖属性的值,其实可以通过公共方法来获取依赖属性的值,如公共方法 GetValue 与SetValue 

1 FrameworkPropertyMetadata 介绍

        其中PropertyMetadata的构造函数具有11个重载版本其中:defaultValue 默认值 、PropertyChangedCallback 回调函数 、CoerceValueCallback 强制转换属性值的类型时要调用的回调方法、bool 类型  isAnimationProhibited 指定该属性是否可在动画过程中发生变化、UpdateSouruceTrigger 数据更新的方式。

拓展


矩形控件 怎么绘制圆? 答:属性RadiusX  RadiusY

<Rectangle
    Width="100"
    Height="100"
    RadiusX="12.5"
    RadiusY="12.5">
    <Rectangle.Fill>
        <LinearGradientBrush StartPoint="1,-1.68" EndPoint="0,1">
            <GradientStop Offset="0" Color="#FFBEAF57" />
            <GradientStop Offset="1" Color="#FFFFFFFF" />
        </LinearGradientBrush>
    </Rectangle.Fill>
</Rectangle>

Pata控件中的Data是什么意思?

        我们可以用M大写,代表我们当前开始绘制图像的一个位置,路径的一个起点。如果我们使用的是小写M则是基于上一个点的一个偏差点 如m25,0 就是相较上一个点X偏差25 Y没有偏差。其中L当我们使用L大写的时候即是代表我们要绘制一条直线,当我们小写的时候即代表我们当前这个点是相较于上一个点的距离。(相对距离)其中C代表我们要绘制一个不规则曲线,其中最后用Z结尾代表将当前的多边形进行闭合 。(L 字母大写代表绝对位置  小写则是相对上一个点的相对位置)其实大家不理解可以直接在Xaml当中绘画一下就知道了。

举个例子:

 <Path
     Margin="0,0,35,0"
     Data="M12,0  L47,0 C18,25 17,81 23,98 35,131 54,144 63,149 L12,149  C3,149 0,143 0,136       L0,12 C0,5 3,0 12,0  z"
     Fill="#FFFFFFFF"
     Stretch="Fill"
     Stroke="{x:Null}">
     <Path.OpacityMask>
         <LinearGradientBrush StartPoint="0,-0.06" EndPoint="0.957,1.127">
             <GradientStop Offset="0" Color="#FF000000" />
             <GradientStop Offset="1" Color="#00FFFFFF" />
         </LinearGradientBrush>
     </Path.OpacityMask>
 </Path>

触发器 DataTrigger的使用方式? 

        使用触发器 DataTrigger 时,它可以帮助您在某个数据对象的属性发生变化时触发特定的操作或更改元素的状态。

举个例子(XAML中):

 <Style TargetType="Button">
     <Style.Triggers>
         <DataTrigger Binding="{Binding IsEnabled}" Value="True">
             <Setter Property="Background" Value="Green" />
         </DataTrigger>
     </Style.Triggers>
 </Style>

示例解释:

        在上面的示例中,当绑定的属性 IsEnabled 的值为 True 时,触发器将更改连接触发器的元素的背景色为绿色。请注意,触发器还可以与其他触发器(如 EventTrigger)一起使用,以实现更复杂的动态效果。

        本章内容学习结束,其中书中大量提到项目示例。我无法给大家提供全面的示例,只会提出几点新了解的知识点进行记录。其他知识点没提可能是经常使用很熟悉则都没有提。

其中关于自定义控件我之前的文章也有过记录,也许能帮助你拓展了解。

工作日志- - -自定义控件(详解)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/134314991?spm=1001.2014.3001.5502

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

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

相关文章

架构设计系列之前端架构和后端架构的区别和联系

前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 一、定位和职责 前端架构 主要关注用户界面和用户体验&#xff0c;负责处理用户与…

10000字讲解TCP协议(确认应答,超时重传,三次握手,四次挥手等等众多机制)以及UDP协议(UDP报文,校验和)

文章目录 UDP协议&#xff1f;什么是校验和&#xff1f;基于UDP的应用层协议(了解) TCP协议确认应答(可靠性机制)超时重传(可靠性机制)连接管理(可靠性机制)三次握手(重点)四次挥手(重点) 三次握手和四次挥手时客户端和服务器的状态滑动窗口(效率机制)流量控制(效率机制)窗口探…

大型语言模型:SBERT — Sentence-BERT

slavahead 一、介绍 Transformer 在 NLP 方面取得了进化进步&#xff0c;这已经不是什么秘密了。基于转换器&#xff0c;许多其他机器学习模型已经发展起来。其中之一是BERT&#xff0c;它主要由几个堆叠的变压器编码器组成。除了用于情感分析或问答等一系列不同的问题外&#…

国产ToolLLM的课代表---OpenBMB机构(清华NLP)旗下ToolBench的安装部署与运行(附各种填坑说明)

ToolBench项目可以理解为一个能直接提供训练ToolLLM的平台&#xff0c;该平台同时构建了ToolLLM的一个开源训练指令集。&#xff0c;该项目是OpenBMB机构&#xff08;面壁智能与清华NLP联合成立&#xff09;旗下的一款产品&#xff0c;OpenBMB机构名下还同时拥有另外一款明星产…

一种基于IWR6843雷达的跌倒检测系统的设计和实现(TI文档)

摘要 随着年龄增长&#xff0c;人体各项生理机能退化严重&#xff0c;老年人很容易发生跌倒&#xff0c;导致身体受到严重的伤害。近年来&#xff0c;随着国内人口老龄化越来越严重&#xff0c;主要针对老年人的跌倒检测系统正受到越来越多的关注。和常用的加速度传感器和视觉技…

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用 目前对选择秒那一列未禁用 <template><div><el-date-pickerv-model"deactivateTime"type"datetime"format"yyyy-MM-dd HH:mm:ss"value-format"yyyy-MM-dd HH…

Unity 通过代码将一张大图切成多个小图的方法

在Unity 中要通过代码将一张贴图切割成多张小图&#xff0c;可以使用以下方法&#xff1a; /// <summary>/// 把一张图片切割成多张使用/// </summary>/// <param name"texture">原图</param>/// <param name"rows">切割的行…

SQL进阶理论篇(十三):数据库的查询优化器是什么?

文章目录 简介什么是查询优化器查询优化器的两种优化方式总结参考文献 简介 事务可以让数据库在增删改查的过程中&#xff0c;保证数据的正确性和安全性&#xff0c;而索引可以帮数据库提升数据的查找效率。查询优化器&#xff0c;则是帮助我们获取更高的SQL查询性能。 本节我…

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚

目录 一、实验 1.环境 2.GitLab新建项目存放K8S部署文件 3.Jenkins手动测试前端项目CD 流水线代码&#xff08;下载部署文件&#xff09; 4. 将K8S master节点配置为jenkins从节点 5.K8S 手动回滚前端项目版本 6.Jenkins手动测试前端项目CD 流水线代码&#xff08;发布应…

空间转录组 多样本整合分析—stlearn

大家好&#xff0c;今天介绍一款空间转录组整合分析的python软件——stlearn。 如果你还不会安装&#xff0c;可以看下之前的推文&#xff0c;windows系统本地安装stlearn&#xff1a;本地安装jupyterlab&#xff0c;并创建conda小环境——以空间转录组细胞互作之stlearn安装为…

设计模式——0前言目录

1 设计模式介绍 应当站在产品经理的角度来学习设计模式 是软件设计中常见问题的典型解决方案&#xff0c;可用于解决代码中反复出现的设计问题 学习效果一般的原因在于自己没有站在产品经理的角度学习&#xff0c;仅仅是为了学习怎么实现&#xff0c;用什么算法实现。 分类&…

telnet的交互原理(wireshark分析)

telnet的交互原理&#xff08;wireshark篇&#xff09; telnet的协议类型是tcp&#xff0c;他的密钥用的是明文的&#xff0c;容易被捕获&#xff0c;所以后来的windows基本弃用了telnet服务端但依然保留了客户端。 下面是他的交互抓包&#xff1a; 这里面的前三条运用的是tc…

一种基于外观-运动语义表示一致性的视频异常检测框架 论文阅读

A VIDEO ANOMALY DETECTION FRAMEWORK BASED ON APPEARANCE-MOTION SEMANTICS REPRESENTATION CONSISTENCY 论文阅读 ABSTRACT1. INTRODUCTION2. PROPOSED METHOD3. EXPERIMENTAL RESULTS4. CONCLUSION阅读总结&#xff1a; 论文标题&#xff1a;A VIDEO ANOMALY DETECTION FRA…

【工作流Activiti】MyActivit的maven项目

1、Idea新建一个项目MyActivit的maven项目 2、安装插件 在 idea 里面&#xff0c;activiti 的插件叫 actiBPM&#xff0c;在插件库里面把它安装好&#xff0c;重启 idea 就行了。 3、 maven 项目中&#xff0c;并更改 pom.xml。pom 中依赖如下&#xff1a; <?xml version…

IntelliJ IDE 插件开发 | (三)消息通知与事件监听

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听 前言 在前两篇文章中讲解了关于插件开发的基础知识&…

【数据结构】二叉树的模拟实现

前言:前面我们学习了堆的模拟实现&#xff0c;今天我们来进一步学习二叉树&#xff0c;当然了内容肯定是越来越难的&#xff0c;各位我们一起努力&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &…

14 v-model绑定输入框

概述 v-model用于实现双向数据绑定&#xff0c;使用v-model绑定输入框是Vue3中最常见的用法之一。 比如&#xff0c;在制作登录界面的时候&#xff0c;我们会使用v-model绑定用户名和密码&#xff0c;这里的用户名和密码都是输入框。 基本用法 我们创建src/components/Demo…

nodejs+vue+微信小程序+python+PHP影片数据爬取与数据分析-计算机毕业设计推荐

管理页面&#xff1a;管理员和用户都可以登录。通过输入账号和密码后&#xff0c;校验无误后方可进入对应的主界面&#xff0c;管理员可对用户使用的权限管理&#xff0c;以及对网站信息进行管理[9]。  影片数据爬取与数据分析分为两个部分&#xff0c;即管理员和用户。该系统…

C/C++编程中的算法实现技巧与案例分析

C/C编程语言因其高效、灵活和底层的特性&#xff0c;被广大开发者用于实现各种复杂算法。本文将通过10个具体的算法案例&#xff0c;详细探讨C/C在算法实现中的技巧和应用。 一、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;是一…

[Toolschain cpp ros cmakelist python vscode] 记录写每次项目重复的设置和配置 不断更新

写在前面 用以前的设置&#xff0c;快速配置项目&#xff0c;以防长久不用忘记&#xff0c;部分资料在资源文件里还没有整理 outline cmakelist 复用vscode 找到头文件vscode debug现有代码直接关联远端gitros杂记repo 杂记glog杂记 cmakelist 复用 包含了根据系统路径找库…