内容简介:在 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 书写新年快乐
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java Message Service API Tutorial and Reference
Hapner, Mark; Burridge, Rich; Sharma, Rahul / 2002-2 / $ 56.49
Java Message Service (JMS) represents a powerful solution for communicating between Java enterprise applications, software components, and legacy systems. In this authoritative tutorial and comprehens......一起来看看 《Java Message Service API Tutorial and Reference》 这本书的介绍吧!