title author date CreateTime categories
WPF 最小的代码使用 DynamicRenderer 书写
lindexi
2019-1-9 14:7:26 +0800
2019-01-08 10:38:30 +0800
WPF 笔迹

在 WPF 中有 DynamicRenderer 提供高性能的书写,这个类在 WPF 只有 InkCanvas 使用,如果想要在自己的 UIElement 使用,需要写一些代码

先创建一个 UIElement 自定义一个,因为 DynamicRenderer 继承于 StylusPlugIn 需要使用 UIElement 的 StylusPlugIns 属性才能添加他

下面创建一个 MeexikelelHaiwurbe 的 UIElement 现在里面什么都没写

    public class MeexikelelHaiwurbe : UIElement
{
}

为了使用 DynamicRenderer 需要支持他的输入层和显示层

输入层

对于 StylusPlugIn 需要加入到 UIElement 的 StylusPlugIns 才能收到触摸的消息

这部分的原理比较复杂,请看 WPF 高速书写 StylusPlugIn 原理

在构造函数添加代码将 DynamicRenderer 添加到 UIElement 的 StylusPlugIns 方法

        public MeexikelelHaiwurbe()
{
var dynamicRenderer = new DynamicRenderer();
StylusPlugIns.Add(dynamicRenderer);
}

现在输入层就做好了,如果现在将 MeexikelelHaiwurbe 添加到界面,可以看到没有任何的显示,因为现在还没有将 DynamicRenderer 的显示层添加到视觉树

如果此时可以看到 DynamicRenderer 的 Down 和 Move 函数,可以看到这两个函数几乎没有触发,原因在于附加的元素没被声明自己的宽度和高度,也就是附加的 MeexikelelHaiwurbe 是不可见的

WPF 高速书写 StylusPlugIn 原理 可以知道,在 StylusPlugIn 要收到触摸的消息,需要附加的元素可以收到消息才可以

所以下面需要设置 MeexikelelHaiwurbe 的宽高

设置宽高

在 UIElement 有一个方法是 HitTestCore 设置命中测试,通过这个方法可以判断一个点是否点到了元素上,于是重新这个方法,无论什么点都返回这个元素,于是这个元素就可以做到命中测试,宽度和高度都是最大

当然有层级的关系,不会点到任何的地方都命中这个元素,关于层级请看 WPF 的原理 WPF 源代码 从零开始写一个 UI 框架 这里面介绍了一个 WPF 框架是如何做的,同时命中测试的原理是什么

        protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
}

如果想要一个元素命中测试不可见,就是返回 null 就可以

但是现在还无法显示笔迹,因为没有放在视觉树

视觉树

现在一个元素显示在界面需要添加到视觉树,请看代码

        private Visual _visual;

        /// <inheritdoc />
public MeexikelelHaiwurbe()
{
var dynamicRenderer = new DynamicRenderer();
StylusPlugIns.Add(dynamicRenderer); _visual = dynamicRenderer.RootVisual; AddVisualChild(_visual);
} protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
} /// <inheritdoc />
protected override Visual GetVisualChild(int index)
{
return _visual;
} /// <inheritdoc />
protected override int VisualChildrenCount => 1;

下面是使用 DynamicRenderer 的最小代码

    public class MeexikelelHaiwurbe : UIElement
{
private Visual _visual; /// <inheritdoc />
public MeexikelelHaiwurbe()
{
var dynamicRenderer = new DynamicRenderer();
StylusPlugIns.Add(dynamicRenderer); _visual = dynamicRenderer.RootVisual; AddVisualChild(_visual);
} protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
} /// <inheritdoc />
protected override Visual GetVisualChild(int index)
{
return _visual;
} /// <inheritdoc />
protected override int VisualChildrenCount => 1;
}

WPF 高性能笔

WPF 高速书写 StylusPlugIn 原理

2019-1-9-WPF-最小的代码使用-DynamicRenderer-书写的更多相关文章

  1. WPF最小化窗体后激活函数显示不了窗体

    WPF最小化窗体后激活函数显示不了窗体 今天测试小哥给我提了一些问题,其中一个问题是这样的,点击web端的一个链接,是能启动本地的一个应用程序的,如果本地应用程序已启动(通过tcp进程间通信),那么应 ...

  2. WPF内嵌代码和后台代码简单混合使用

    下面实例展示了WPF内嵌代码和后台代码混合使用,一个简单基础的实例: xaml文件: <Window x:Class="WPF内嵌代码和后台代码混合使用.MainWindow" ...

  3. Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码

        本主题帮助你理解来自Prism的多目标和它的优缺点.多目标的代码针对两个不同的平台有大致相同的代码库.这允许同时保持代码尽可能多一样能够产生针对两种不同技术的二进制文件.在这种情况下,本节介绍 ...

  4. WPF中通过代码设置控件的坐标

    用WPF做贪吃蛇小游戏时,发现了一个问题: 贪吃蛇的移动,我是通过不断刷新Rectangle来实现(贪吃蛇的身体由一组Rectangle组成),因此需要不断调整Rectangle的坐标,但是WPF中没 ...

  5. WPF中通过代码定义模板

    WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...

  6. [WPF]如何使用代码创建DataTemplate(或者ControlTemplate)

    1. 前言 上一篇文章([UWP]如何使用代码创建DataTemplate(或者ControlTemplate))介绍了在UWP上的情况,这篇文章再稍微介绍在WPF上如何实现. 2. 使用Framew ...

  7. WPF中C#代码触发鼠标点击事件

    1.如下代码; <Button x:Name="btnTest" Click="btnTest_Click"> <Button.Trigger ...

  8. StarUML3.1.0版(2019.3.6)生成Java代码

    下载官网 StarUML3.1.0(2019.3.6) 步骤 打开StarUML: 点击菜单栏的Tools: 列表中如果有Java,说明已经有这个生成Java代码的扩展了: 列表里如果没有Java: ...

  9. wpf 中用 C# 代码创建 PropertyPath ,以对间接目标进行 Storyboard 动画.

    如图,一个 Rectangle 一个 Button ,点击按钮时要通过动画完成对 Rectangle填充色的渐变动画. Xaml: 1 <Window 2 x:Class="WpfAp ...

  10. WPF嵌入Unity3D代码下载

    这不是大家想找的资源,这是给我的一个帖子用的.当然可以使用u3d自带编译器打开.这是给wpf 嵌入u3d的例子贴用http://bbs.csdn.net/topics/391853486?page=1 ...

随机推荐

  1. TZ_16_Vue_入门案例

    1.新建一个html文件导入vue.js <script src="node_modules/vue/dist/vue.js"></script> 2.创建 ...

  2. 了解真实的『REM』多终端屏幕适配

    作者:hbxeagle 链接:github.com/hbxeagle/rem/blob/master/README.md rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使 ...

  3. linux 修改命令提示符&ubuntu目录颜色个性化

    1.linux 命令提示符个性化 在 ANSI 兼容终端(例如 xterm.rxvt.konsole 等)里, 可以用彩色显示文本而不仅仅是黑白. 本文示范了如何使用粗体和彩色的文字.     相信每 ...

  4. 做移动应用使用地图API时需要注意的问题

    最近在做一个基于地点提醒的移动应用,当初考虑大家都心知肚明的原因,谨慎的选择了百度地图,现在想想其实完全没有必要,好的应用本来就不分国界的,最后可能还是得换回Google地图.毕竟Google地图在技 ...

  5. spring四种依赖注入方式(转)

    spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...

  6. Jboss 默认加载项目访问

    修改JBOSS的server.xml路径为: D:\Program Files\jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer\serv ...

  7. 关于python的列表操作(二):排序,统计

    # 列表操作 num_list = [2, 5, 8, 6, 7, 9, 5, 7] # 升序 num_list.sort() print(num_list) # 降序 num_list.sort(r ...

  8. 中介者模式(Mediator、ConcreteMediator、Colleague Class)(租房中介)

    中介者模式就是利用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. 就像租房的中介系统,房主跟租房者不需要知道彼此只需要,只 ...

  9. centos 安装nginx + 多个tomcat负载均衡

    今天在centos上安装了两个tomcat和nginx,进行配置.今天记录的只是最基本的实现测试.(不包含使用redis进行session共享) Nginx 是一款轻量级的Web 服务器/反向代理服务 ...

  10. 【洛谷P2907】 【USACO08OPEN】农场周围的道路 水模拟分治

    P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm 题目描述 Farmer John's cows have taken an interest in ex ...