C#
文章平均质量分 69
聂14昊51
努力+耐心
展开
-
WPF高级教程(十八)行为
介绍在讲解到样式的时候我们说,样式是为了一系列元素共享一些属性而存在的,归根结底是为了复用代码和逻辑,而我们学习了触发器之后,发现我们可以用触发器写一些简单的逻辑到样式中,但是这种简单的逻辑有时候远远不够。当我们要实现一堆元素支持在Cancas上面拖放,停靠,缩放等功能的时候,触发器就显得不是那么够用了。我们在复用代码的时候,有下面三种方法,他们互相补充,构建了WPF的属性重用架构,在合适的...原创 2020-03-16 22:55:02 · 2232 阅读 · 3 评论 -
WPF高级教程(十七)触发器
使用触发器触发器可以让我们的界面可以自动化完成一些简单的样式改变,如鼠标放上去变色等。在样式中添加触发器就是往 Style.Triggers 集合里面添加触发器,只要是派生自 TriggerBase 的实例都是可以添加到集合中的,有下面几类注意,我们可以为任何依赖项属性设置一个触发器,我们看下面的例子<Style TargetType="Button"> <St...原创 2020-03-16 22:13:47 · 754 阅读 · 0 评论 -
WPF高级教程(十六)样式
概念样式是可以应用于元素的一系列属性值的集合。样式期望使用一份xaml代码来设置一系列元素的细节,比如内外边距,字体颜色等。样式类似于CSS但是要比CSS更加强大,强大之处在于:可以设置依赖项属性,使其可以控制控件行为支持触发器可以使用模板重新定义控件的内置外观定义和设置样式定义样式<Window.Resources> <Style x:Key="B...原创 2020-03-16 21:53:14 · 839 阅读 · 0 评论 -
WPF高级教程(十五)对象资源
概念对象资源是使用代码定义的一系列可以重用的对象,包括 画刷,样式,模板 等。WPF允许在代码中以及在xaml中各个位置定义对象资源。资源集合在FrameworkElement中定义了一个Resources属性,该属性使用Resource Dictionary类的实例填充,用于存储元素上的资源。根据我们之前学习的体系结构,定义在FrameworkElement也就表明了所有的WPF元素都具有...原创 2020-03-10 22:40:16 · 738 阅读 · 0 评论 -
WPF高级教程(十四)程序集资源
分类WPF中的资源分为两类:程序集资源对象资源其中,程序集资源指的是软件开发中用到的图片,声音,xml文件等资源,这些资源被添加到项目中之后会被嵌入到编译过得程序集中,会被编译成二进制数据。而对象资源是一些.NET对象,希望能够一次定义多次使用,包括画刷,样式,模板等。本文我们将着重介绍程序集资源,下一文我们介绍对象资源程序集资源介绍应用程序资源包括 图片,音频等应用程序需要使...原创 2020-03-10 22:34:23 · 1212 阅读 · 0 评论 -
WPF高级教程(十三)命令
概念命令是事件更高层次的抽象。我们在WinForm的开发中,一个事件处理程序就是一个命令,而如果我们很多事件都对应着一套处理程序,我们会将处理程序提出去,处理程序就相当于一个命令,而在WPF中,原声提供了一套更高抽象的命令供我们使用,我们将要学的就是这个抽象出来的命令模型。缺陷WPF的命令模型的优势我们在之后的讲解中大家会慢慢感受到,我们先讲讲缺陷,也就是WPF的命令不能做什么,如果接到一个...原创 2020-03-05 08:53:54 · 1174 阅读 · 0 评论 -
WPF高级教程(十二)元素绑定
绑定的限制需要注意:绑定只能写在依赖项属性上。原因我们在上一文中讲过:源数据可以是任意数据,而目标必须是依赖项属性,所以绑定只能写在依赖项属性。元素绑定的好处如果我们想要实现一个滑动条,滑动的值显示再后面的TextBox中,我们的实现方法有下面两种:之前的方法:在滑动条改变的事件中改变TextBox的值使用绑定直接在xaml中指定滑动条和TextBox的对应关系很明显,在xaml中...原创 2020-03-04 09:47:36 · 679 阅读 · 0 评论 -
WPF高级教程(十一)绑定说明
概念绑定是一种关系,告诉目标对象使用原对象的一些信息设置其属性值。分类绑定关系分为很多种,但是本质上来说是 目标对象的属性 和 源对象的属性 进行绑定。我们这里我们要求:目标对象的属性必须是依赖项属性(这点很好理解,依赖项属性提供了让对象可以根据数据源改变的能力)源对象属性可以是任何内容,包括依赖项属性,其他WPF元素,甚至是ADO.NET数据对象通过上面的说明我们发现,绑定这块...原创 2020-02-26 16:56:30 · 500 阅读 · 0 评论 -
WPF高级教程(十)WPF程序的生命周期
介绍就像每一个窗口对应一个Window类一样,每一个WPF的应用程序对应一个Application类生命周期创建WPF程序中,Application类的创建是由App.xaml中完成的,具体的代码如下<Application x:Class="TestProject.App" xmlns="http://schemas.microsoft.com/winf...原创 2020-02-26 15:34:24 · 2418 阅读 · 0 评论 -
WPF高级教程(九)控件
定义能够与用户交互的元素。继承自System.Windows.Control,基类提供以下能力:设置对齐方式设置Tab顺序背景,前景,边框文本内容尺寸和字体注意在有时候,我们会在描述的时候说:这是界面上的一个控件,这是界面上的一个元素,那么,控件和元素有什么关系和区别呢?实际上,界面上的可视化的内容就是元素,而能够接受焦点并且能与用户交互的元素叫做控件,所以元素的概念包含控件。这点...原创 2020-02-26 15:14:41 · 2095 阅读 · 0 评论 -
WPF高级教程(八)专题:事件
概述除了路由事件,WPF中还有非路由事件,这个专题介绍一下WPF中所有的事件。都有哪些事件生命周期事件,元素的初始化,加载,卸载时发生鼠标事件键盘事件手写笔事件多点触控事件下面就逐个介绍这些事件,大家可以先做一个简单的了解,当要深入使用这些事件的时候查询这篇文章即可生命周期事件一个元素创建流程大致是这样:首先需要解析Xaml,然后初始化,再渲染样式,应用布局和绑定。Xa...原创 2020-02-26 11:07:17 · 2566 阅读 · 0 评论 -
WPF高级教程(七)路由事件
介绍与依赖项属性一样,路由事件是WPF对于传统.NET事件的升级,使得事件拥有更强的传播能力。定义,注册和包装// 我们来看一个Click事件定义的例子public abstract class ButtonBase : ContentControl{ // 定义路由事件 public static readonly RoutedEvent ClickEvent; ...原创 2020-02-26 10:42:29 · 841 阅读 · 0 评论 -
WPF高级教程(六)依赖项属性
概述依赖项属性是属性的一种全新的实现。通过对原有属性的升级,依赖项能够实现数据绑定,动画或者WPF的其他进阶功能。通过对于依赖项属性的封装,使得依赖项属性的使用与普通属性一样,这样既兼容了老的使用方法,又把WPF的新特性带到了普通的WPF程序中。功能每个依赖项属性都支持 更改通知和动态值识别,这也是依赖项属性的特点和基础实现定义依赖项属性只能为依赖对象(继承自Dependency...原创 2020-02-26 10:29:11 · 1174 阅读 · 0 评论 -
WPF高级教程(五)专题:Grid
前言Grid是WPF中最强大的布局容器,值得我们专门使用一个专题来了解Grid的使用。使用行列定义<Grid ShowGridLines="True"> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <ColumnDe...原创 2020-02-26 09:20:24 · 1294 阅读 · 0 评论 -
WPF高级教程(四)布局
布局原则空间的尺寸可以自适应。(要实现这样的效果需要不显式的指定控件尺寸,而是设置控件尺寸的最大最小值)不设置绝对定位,使用相对定位(比如使用margin就是相对定位而非绝对坐标)布局控件能为子控件合理分配尺寸布局控件可以嵌套布局控件类关系布局控件都派生自Panel(类关系可以在之前的文章中找到)。Panel是一个抽象类,提供了一些公共属性。注意1:当我们在实际工作中,会出现点...原创 2020-02-26 09:11:43 · 1148 阅读 · 0 评论 -
WPF高级教程(三)XAML
语言简介XAML(Extensible Application Markup Language) 是用来写界面的XAML是大小写敏感的WPF是前后端分离的,前端用XAML实现,后端用C#写(注意能用XAML写的都能用C#实现,但是用XAML更加直观,我们在本篇教程里,一般只说明使用XAML的实现,如果大家需要在后台更改界面,可以自行搜索XAML对应的C#实现)命名空间格式xmlns...原创 2020-02-26 08:38:54 · 2203 阅读 · 0 评论 -
WPF高级教程(二)体系结构
体系结构控件,窗口,基础形状,样式等都在PresentationFramework和PresentationCore中依赖项属性在WindowsBase中提供milcore 托管图形,与Direct3D集成。渲染核心,不仅应用于WPF,也应用于系统界面的渲染WindowsCodecs 图像处理底层APIDirect3D 最低级图形渲染API,它是DirectX的一部分User32 ...原创 2020-02-20 16:35:22 · 993 阅读 · 1 评论 -
DotNetty完全教程(十一)
编码器和解码器定义编码器负责将应用程序可以识别的数据结构转化为可传输的数据流,解码器反之。对于应用程序来说,编码器操作出站数据,解码器操作入站数据。解码器和Handler解码器因为是处理入站数据的,所以继承了ChannelInBoundHandler.我们理解的时候可以认为解码器就是一种特殊的Handler,用于处理信息。解码器的类型ByteToMessageDecoderRepl...原创 2019-10-31 16:03:27 · 4363 阅读 · 4 评论 -
DotNetty完全教程(十)
单元测试EmbeddedChannel介绍EmbeddedChannel是专门为了测试ChannelHandler的传输。我们先看一下他的API用一张图来描述这样的一个模拟过程编写基于xUnit的单元测试新建一个xUnit工程 UnitTest新建一个用于测试EmbededChannel的工程 EmbededChannelTestEmbededChannelTest工程需要引用...原创 2019-10-30 16:01:14 · 3725 阅读 · 0 评论 -
DotNetty完全教程(九)
引导Bootstrap引导一个应用程序是指对他进行配置并且使他运行的过程。体系结构注意,DotNetty没有实现Cloneable的接口,而是直接实现了一个Clone方法。Netty实现这个接口是为了创建两个有着相同配置的应用程序,可以把一个配置整体应用到另一个上面,需要注意的是EventLoopGroup是一个浅拷贝,这就导致了拷贝的Bootstrap都会使用同一个EventLoopGr...原创 2019-10-30 15:50:31 · 5118 阅读 · 2 评论 -
DotNetty完全教程(八)
EventLoop介绍我们先回顾一下,EventLoop就是我们在最开始的示意图中的Selector,每个EventLoop和一个线程绑定,用于处理多个Channel。任务调度如果我们想实现延时任务的调度,比如连接成功5s之后发送一包数据,就可以用到EventLoop的计划任务ctx.Channel.EventLoop.Schedule(() =>{ Console.Wr...原创 2019-10-30 15:41:41 · 3956 阅读 · 0 评论 -
DotNetty完全教程(七)
ChannelPipeline和ChannelHandleContext介绍ChannelPipeline是一系列ChannelHandler连接的实例链,这个实例链构成了应用程序逻辑处理的核心。下图反映了这种关联:ChannelHandlerContext提供了一个ChannelPipeline的上下文,用于ChannelHandler在Pipeline中的交互,这种交互十分的灵活,不仅...原创 2019-10-30 15:37:28 · 4978 阅读 · 0 评论 -
DotNetty完全教程(六)
资源管理目的在处理数据的过程中,我们需要确保没有任何的资源泄漏。这时候我们就得很关心资源管理。引用计数的处理使用完ByteBuf之后,需要调整其引用计数以确保资源的释放内存内漏探测Netty提供了ResourceLeakDetector来检测内存泄漏,因为其是采样检测的,所以相关开销并不大。泄露日志检测级别手动释放消息ReferenceCountUtil.SafeRelea...原创 2019-10-30 15:17:55 · 4264 阅读 · 0 评论 -
DotNetty完全教程(五)
ChannelHandler本篇文章着重介绍ChannelHandlerChannel的生命周期我们复习一下,Channel是Socket的抽象,可以被注册到一个EventLoop上,EventLoop相当于Selector,每一个EventLoop又有自己的处理线程。复习了这部分的知识,我们就知道在Channel的生命中,有以下这么几个关键的时间节点。ChannelHandler的生...原创 2019-10-30 15:11:54 · 4901 阅读 · 2 评论 -
DotNetty完全教程(四)
ByteBufferNetty中ByteBuffer的介绍Netty 的数据处理 API 通过两个组件暴露——abstract class ByteBuf 和 interfaceByteBufHolderDotNetty中有AbstractByteBuffer IByteBuffer IByteBufferHolder优点:它可以被用户自定义的缓冲区类型扩展;通过内置的复合缓冲区...原创 2019-10-30 10:37:03 · 8262 阅读 · 4 评论 -
DotNetty完全教程(三)
组件介绍ChannelChannel是Socket的封装,提供绑定,读,写等操作,降低了直接使用Socket的复杂性。EventLoop我们之前就讲过EventLoop这里回顾一下:一个 EventLoopGroup 包含一个或者多个 EventLoop;一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;所有由 EventLoop 处理的 I/O 事件都将在它...原创 2019-10-30 09:47:00 · 9106 阅读 · 0 评论 -
DotNetty完全教程(二)
第一个DotNetty应用程序准备工作NuGet包介绍DotNetty由九个项目构成,在NuGet中都是单独的包,可以按需引用,其中比较重要的几个是以下几个:DotNetty.Common 是公共的类库项目,包装线程池,并行任务和常用帮助类的封装DotNetty.Transport 是DotNetty核心的实现DotNetty.Buffers 是对内存缓冲区管理的封装DotNett...原创 2019-10-30 09:34:51 · 15668 阅读 · 8 评论 -
DotNetty完全教程(一)
写本系列文章的目的我一直以来都在从事.NET相关的工作,做过工控,做过网站,工作初期维护过别人写的网络库,后来自己写网络库,我发现在使用C#编程的程序员中,能否写出高性能的网络库一直都是考验一个程序员能力的标杆。为了写出高性能的网络库,我查阅了很多资料,发现Java的Netty有着得天独厚的设计以及实现优势,Java也因为Netty的存在,在开发大吞吐量的应用程序中得心应手。我想,.NET程序...原创 2019-10-30 09:23:23 · 33635 阅读 · 2 评论 -
【一句话解释一个技术点】ManualResetEvent
当你在某个例程中看到ManualResetEvent你可能会很好奇这是个什么东西,于是百度,发现了这样的解释ManualResetEvent 是一线程用来控制别一个线程的信号。然后看了例程一头雾水,那这篇文章就是来拯救你的。原创 2017-12-14 16:42:55 · 3744 阅读 · 4 评论