zoukankan      html  css  js  c++  java
  • WPF DrawingVisual绘图DEMO

    在winform 中我们使用GDI+ 进行绘图,到了WPF, 使用的是DirectX渲染,所以不能使用GDI+ 进行绘图,

    但是其实WPF中也是有绘图单元的,本文用DrawingVisual 来进行基础的绘图,在一张图片上进行画正弦信号图:

    先从Image类继承一个绘图的单元:
    public class DrawingImage:Image
        {
            private List<Visual> visuals = new List<Visual>();
    
            protected override Visual GetVisualChild(int index)
            {
                return visuals[index];
            }
            protected override int VisualChildrenCount
            {
                get
                {
                    return visuals.Count;
                }
            }
    
            public void AddVisual(Visual visual)
            {
                visuals.Add(visual);
    
                base.AddVisualChild(visual);
                base.AddLogicalChild(visual);
            }
    
            public void DeleteVisual(Visual visual)
            {
                visuals.Remove(visual);
    
                base.RemoveVisualChild(visual);
                base.RemoveLogicalChild(visual);
            }
    
            public DrawingVisual GetVisual(Point point)
            {
                HitTestResult hitResult = VisualTreeHelper.HitTest(this, point);
                return hitResult.VisualHit as DrawingVisual;
            }
    
            private List<DrawingVisual> hits = new List<DrawingVisual>();
            public List<DrawingVisual> GetVisuals(Geometry region)
            {
                hits.Clear();
                GeometryHitTestParameters parameters = new GeometryHitTestParameters(region);
                HitTestResultCallback callback = new HitTestResultCallback(this.HitTestCallback);
                VisualTreeHelper.HitTest(this, null, callback, parameters);
                return hits;
            }
    
            private HitTestResultBehavior HitTestCallback(HitTestResult result)
            {
                GeometryHitTestResult geometryResult = (GeometryHitTestResult)result;
                DrawingVisual visual = result.VisualHit as DrawingVisual;
                if (visual != null &&
                    geometryResult.IntersectionDetail == IntersectionDetail.FullyInside)
                {
                    hits.Add(visual);
                }
                return HitTestResultBehavior.Continue;
            }
        }

    XAML页面中使用
    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid x:Name="Main">
            <local:DrawingImage x:Name="panel" Source="Tulips.png" Stretch="Fill"></local:DrawingImage>
                   
        </Grid>
    </Window>
    
    
    后台添加绘图程序:
    public MainWindow()
            {
                InitializeComponent();
                DrawingVisual visualx = new DrawingVisual();
                using (DrawingContext dc = visualx.RenderOpen())
                {
                    dc.PushOpacity(0.8);
                    dc.PushOpacityMask(Brushes.Red);
                    Pen pen = new Pen(Brushes.Green, 2);
                    for (int i = 0; i < 500; i ++)
                    {                
                        dc.DrawLine(pen, new Point(i*2, Math.Sin(i*0.1)*100 + 200), new Point((i + 1)*2, Math.Sin((i + 1)*0.1)*100 + 200));
                        dc.DrawText(new FormattedText("Hello, World!", CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 10, Brushes.CornflowerBlue), new Point(i * 2, Math.Sin(i * 0.1) * 100 + 200));
                    }                
                }
                panel.AddVisual(visualx);         
            }

    看下效果:

     
  • 相关阅读:
    windows下安装部署RocketMQ
    Windows安装RabbitMQ
    HttpClient工具类
    Docker部署Spring Boot项目
    在Docker中安装Redis以及主从环境搭建
    df命令得到一个诡异的现象
    一个“稍后再读”的软件 POCKET
    也是关于 Stay Hungry. Stay Foolish.
    改用thebrain做思维导图
    文件系统只读,一个没有解决的问题(续)
  • 原文地址:https://www.cnblogs.com/yeshuimaowei/p/7234491.html
Copyright © 2011-2022 走看看