首页 > 其他分享 >用Wpf做一个画笔画板(续5-Diagram画板)

用Wpf做一个画笔画板(续5-Diagram画板)

时间:2023-05-20 17:57:35浏览次数:50  
标签:画笔 Geometry pathGeometry 画板 Diagram Points var new Wpf

先上效果图吧

同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram

本次实现的内容有

    • [1] 画笔实现
    • [2] 封闭画笔实现
    • [3] 钢笔实现
    • [4] 文字画笔
    • [5] 直线,矩形,椭圆
    • [6] Path形状
    • [7] 取色器
    • [8] 三种画笔可选

画笔示例入口

 

 示例截图

 核心代码:

1.Ellipse的实现:Geometry = new EllipseGeometry(new Rect(Points[0], Points[1]));

2.Rectangle的实现:   Geometry = new RectangleGeometry(new Rect(Points[0], Points[1]));

3.Line的实现:  Geometry = new LineGeometry(Points[0], Points[1]);

4.文本的实现:

var formattedText = new FormattedText(Text,
System.Globalization.CultureInfo.InvariantCulture,
FlowDirection.LeftToRight,
typeface,
FontViewModel.FontSize,
new SolidColorBrush(FontViewModel.FontColor));

Geometry = formattedText.BuildGeometry(new Point()).GetFlattenedPathGeometry();

5.多点连接线 

var geometry = new PathGeometry();
var figure = new PathFigure { StartPoint = Points[0] };
geometry.Figures.Add(figure);

for (int i = 1; i < Points.Count; i++)
{
LineSegment arc = new LineSegment(Points[i], true);
geometry.Figures[0].Segments.Add(arc);
}

Geometry = geometry;

6.Path形状

var path = GetPath();
PathGeometry pathGeometry = PathGeometry.CreateFromGeometry(Geometry.Parse(path));
var transformGroup = new TransformGroup();
double radiox = Math.Abs(Points[1].X - Points[0].X) / pathGeometry.Bounds.Width;
double radioy = Math.Abs(Points[1].Y - Points[0].Y) / pathGeometry.Bounds.Height;
transformGroup.Children.Add(new TranslateTransform((Points[0].X) / radiox - pathGeometry.Bounds.Left, (Points[0].Y) / radioy - pathGeometry.Bounds.Top));
transformGroup.Children.Add(new ScaleTransform(radiox, radioy));
pathGeometry.Transform = transformGroup;
Geometry = pathGeometry;

7.橡皮的实现

erase.Transform = new TranslateTransform(0 - Left, 0 - Top);

Geometry = Geometry.Combine(Geometry, erase, GeometryCombineMode.Exclude, null);

8.取色器的实现

var point = CursorPointManager.GetCursorPosition();
Root.CurrentColor = ColorPickerManager.GetColor(point.X, point.Y);

讲一个关键点:形状要可擦除,必须要转换一下

Geometry = Geometry.GetWidenedPathGeometry(aPen); 

今天实在有点懒得搞,就这样吧。

 

标签:画笔,Geometry,pathGeometry,画板,Diagram,Points,var,new,Wpf
From: https://www.cnblogs.com/akwkevin/p/17417546.html

相关文章

  • WPF.Basic.数据绑定
    WPF常用五种数据绑定方式 绑定方式一(绑定元素依赖属性)<StackPanel><SliderName="s1"Value="10"Maximum="100"></Slider><TextBlockFontSize="{BindingElementName=s1,Path=Value}"Text="看着我">......
  • WPF.Basic.依赖属性
    1依赖属性定义  在WPF界面的数据绑定中,为了能够使绑定源数据和绑定目标在变更后能够通知对方,.net在原来的属性之上设计了依赖属性    所以支持绑定的属性本质上它都是封装后的依赖属性。那么也就是说,只有依赖属性才可以进行绑定。  1依赖属性使用publiccl......
  • wpf XAML 设计器异常,提示NullReferenceException 未将对象引用设置到对象
     在cs构造函数里手动注册,并且在控件的构造函数里增加判断if(DesignerProperties.GetIsInDesignMode(this)){return;}//在这里才注册Load事件cmbSpeed.Loaded+=cmbSpeed_Loaded;来源:https://www.cnblogs.com/zsx-blog/p/8311633.html ......
  • C# WPF 实现高频量化,自动运行。
    基于交易所编写的量化交易程序。由WPF和C#实现。改进版。再也不用时时刻刻盯盘了。 并非上图的思路所编写,仅供参考,思路由个人的想法异同。仅仅个人用途。不做商业用途。如下图所示,会在任务栏实时刷新价格,也可以mini窗口显示。由于存储限制,用了灰色的gif演示。都是现货的思路......
  • WPF单进程实例
    用互斥量Mutex实现如果已经存在Mutex,则会创建失败。注意:Mutex要声明成全局的,不能是局部变量,否则会判断失败。 重写Startup函数,加上单例判断。参考下面代码:1publicpartialclassApp:Application2{3System.Threading.Mutexmutex;45......
  • 从桌面端到移动端,.NET MAUI为什么对WPF开发人员更简单?
    .NET多平台应用程序UI(.NETMAUI)的市场吸引力与日俱增,这是微软最新的开发平台,允许开发者使用单个代码库创建跨平台应用程序。尽管很多WPF开发人员还没有跟上.NETMAUI的潮流,但我们将在这篇文章中为大家展示他的潜力,具体来说想描述一下WPF和.NETMAUI之前的共性。PS:DevExpressWP......
  • WPF.Basic.样式基础(一)
    WPF的样式总的来说有两种使用方式1.全局样式1.1在Windows.Resources下定义全局样式,当然Style作为一种资源,也可以在其他的地方定义资源(当没有X:KEY(扩展标记)值的时候就是对TargetType都有用,无语targetType绑定资源)1<Windows.Resources>2<Stylex:Key="Buttonstyle......
  • WPF 异步加载数据,窗体事件
    加载WPF界面时,需要获取数据,而数据返回的时间比较长,这个时候可以异步加载数据到界面。 1、首先在XAML中触发窗口载入事件 2、在后台代码中处理窗口载入事件(1)找到主窗口类 (2)在MainWindow类中添加XAML中加入的窗口载入事件 这个事件中可以放置各种界面预处理代码 n......
  • WPF.Basic.ICommand使用
    WPF命令绑定的各种方式引言在WPF开发过程中,不得不学习的就是MVVM模式。但是在MVVM中又绕不开命令(Command)的使用。下面通过几种方式介绍我了解的WPF命令绑定方式。如何使用控件继承ICommand接口,直接使用Command首先通过这里简单介绍Command在MVVM中的使用。ViewModel类......
  • 大型源码C# MES WPF CS/BS两套 1, 整体程序由WPF(c#)开发; 2
    大型源码C#MESWPFCS/BS两套1,整体程序由WPF(c#)开发;2,各个文档齐全;3,需要您对WPF和程序架构有比较深入理解;4,包含服务程序;5,包含SCADA数据采集系统;6,包含数据看板;7,包含各种组件;8,包含完整的各个处理脚本。9,由多个产品线程序组成。10,数据库的使用。11,远程服务器的调用......