• 2019-1-9-WPF-最小的代码使用-DynamicRenderer-书写


    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 原理

  • 相关阅读:
    Linux学习
    PHP语法笔记
    iOS二次发育(swift)闭包
    iOS二次发育(swift)类
    iOS二次发育(swift)结构体
    iOS二次发育(swift)枚举
    【NOIP2013模拟联考14】隐藏指令
    【NOIP2012模拟8.9】逐个击破
    NOIP2020.9.19模拟patrick
    NOIP2020.9.19模拟 spongebob
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085871.html
Copyright © 2020-2023  润新知