内容简介:在 WPF 中有 DynamicRenderer 提供高性能的书写,这个类在 WPF 只有 InkCanvas 使用,如果想要在自己的 UIElement 使用,需要写一些代码先创建一个 UIElement 自定义一个,因为 DynamicRenderer 继承于 StylusPlugIn 需要使用 UIElement 的 StylusPlugIns 属性才能添加他下面创建一个 MeexikelelHaiwurbe 的 UIElement 现在里面什么都没写
在 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 最小的代码使用 DynamicRenderer 书写》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 书写可维护代码的重要性
- VS Code书写vue项目配置 eslint+prettier 统一代码风格
- 复杂sql书写方法
- css BEM书写规范
- 书写良好的 Git 提交信息
- python turtle 书写新年快乐
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Nature of Code
Daniel Shiffman / The Nature of Code / 2012-12-13 / GBP 19.95
How can we capture the unpredictable evolutionary and emergent properties of nature in software? How can understanding the mathematical principles behind our physical world help us to create digital w......一起来看看 《The Nature of Code》 这本书的介绍吧!