zoukankan      html  css  js  c++  java
  • 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 原理

  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085871.html
Copyright © 2011-2022 走看看