前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WPF 最小的代码使用 DynamicRenderer 书写 输入层设置宽高视觉树

WPF 最小的代码使用 DynamicRenderer 书写 输入层设置宽高视觉树

作者头像
林德熙
发布2019-03-13 14:31:14
9110
发布2019-03-13 14:31:14
举报
文章被收录于专栏:林德熙的博客林德熙的博客

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

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

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

代码语言:javascript
复制
    public class MeexikelelHaiwurbe : UIElement
    {
    }

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

输入层

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

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

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

代码语言:javascript
复制
        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 框架是如何做的,同时命中测试的原理是什么

代码语言:javascript
复制
        protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
        {
            return new PointHitTestResult(this, hitTestParameters.HitPoint);
        }

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

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

视觉树

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

代码语言:javascript
复制
        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 的最小代码

代码语言:javascript
复制
    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 原理


本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/WPF-%E6%9C%80%E5%B0%8F%E7%9A%84%E4%BB%A3%E7%A0%81%E4%BD%BF%E7%94%A8-DynamicRenderer-%E4%B9%A6%E5%86%99.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议
知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入层
  • 设置宽高
  • 视觉树
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档