《.NET6: 开发基于WPF的摩登三维工业软件 (1)》我们创建了一个"毛坯"界面,距离摩登还差一段距离。本文将对上一阶段的成果进行深化,实现当下流行的暗黑风格UI。

1 设置暗黑主题

利用MergedDictionaries配置,在已有的通用风格基础上添加Dark.Blue主题。代码如下:

App.xaml

  1. <Application.Resources>
  2. <ResourceDictionary>
  3. <ResourceDictionary.MergedDictionaries>
  4. <ResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Generic.xaml" />
  5. <ResourceDictionary Source="pack://application:,,,/Fluent;component/Themes/Themes/Dark.Blue.xaml" />
  6. </ResourceDictionary.MergedDictionaries>
  7. </ResourceDictionary>
  8. </Application.Resources>

运行一下:

主题已经变成了暗黑模式。

2 给Button增加图标

2.1 引入图片

在项目目录下增加Resources目录,把circle.png复制到Resources目录下。

在项目浏览器中把图片添加到项目,选择Resources目录,右键菜单:

选择Resources/circle.png

2.2 设置图片属性

选择图片,在属性面板中设置:

  • 复制到输出目录: 始终复制
  • 生成操作:内容

按照上述步骤加入其他的图片。

2.3 Ribbon Button中使用图片

为Fluent:Button设置Icon属性,引用图片资源

  1. <!--Tabs-->
  2. <Fluent:RibbonTabItem Header="建模">
  3. <Fluent:RibbonGroupBox Header="基本体" IsLauncherVisible="False">
  4. <Fluent:Button Header="直线" Icon="/Resources/line.png" Size="Large"/>
  5. <Fluent:Button Header="圆弧" Icon="/Resources/arc3pts.png" Size="Large"/>
  6. <Fluent:Button Header="圆形" Icon="/Resources/circle.png" Size="Large"/>
  7. </Fluent:RibbonGroupBox>
  8. </Fluent:RibbonTabItem>
  9. <Fluent:RibbonTabItem Header="设置">
  10. </Fluent:RibbonTabItem>

运行一下:

3 增加Button响应消息

3.1 增加路由命令

定义RoutedCommand用于响应Button的点击事件。

MainWindow.xaml.cs

  1. public partial class MainWindow
  2. {
  3. // 定义路由命令
  4. public static readonly RoutedCommand ExecuteCommand = new RoutedCommand("Rapid", typeof(MainWindow));
  5. public MainWindow()
  6. {
  7. InitializeComponent();
  8. // 绑定响应函数
  9. CommandBindings.Add(new CommandBinding(ExecuteCommand, OnExecuteCommand));
  10. }
  11. private void RibbonWindow_Loaded(object sender, RoutedEventArgs e)
  12. {
  13. }
  14. // 处理点击命令
  15. private void OnExecuteCommand(object sender, ExecutedRoutedEventArgs e)
  16. {
  17. }
  18. }

3.2 XAML里绑定Button绑定事件

  • Command: 绑定的命令
  • CommandParameter: 命令参数

MainWindow.xaml

  1. <Fluent:Button Header="直线" Icon="/Resources/line.png" Size="Large" Command="{x:Static local:MainWindow.ExecuteCommand}"
  2. CommandParameter="line"/>
  3. <Fluent:Button Header="圆弧" Icon="/Resources/arc3pts.png" Size="Large" Command="{x:Static local:MainWindow.ExecuteCommand}"
  4. CommandParameter="arc"/>
  5. <Fluent:Button Header="圆形" Icon="/Resources/circle.png" Size="Large" Command="{x:Static local:MainWindow.ExecuteCommand}"
  6. CommandParameter="circle"/>

3.3 命令处理函数

MainWindow.xaml.cs

csharp // 处理点击命令 private void OnExecuteCommand(object sender, ExecutedRoutedEventArgs e) { switch (e.Parameter.ToString()) { case "line": { var shape = SketchBuilder.MakeLine(new GPnt(0, 0, 0), new GPnt(10, 10, 0)); mView3d.ShowShape(shape, ColorTable.AliceBlue); } break; case "arc": { var shape = SketchBuilder.MakeArcOfCircle(new GPnt(0, 0, 0), new GPnt(10, 10, 0), new GPnt(5,15,0)); mView3d.ShowShape(shape, ColorTable.AliceBlue); } break; case "circle": { var shape = SketchBuilder.MakeCircle(new GPnt(0, 0, 0), 5, GP.DZ()); mView3d.ShowShape(shape, ColorTable.AliceBlue); } break; } }

运行一下,挨个Button点一遍:

4 综合建模

爱心巧克力

一种实现方法:

  • 由线生成爱心平面轮廓
  • 轮廓填充成面
  • 面拉伸成体
  • 对体倒角
  1. {
  2. var arc1 = SketchBuilder.MakeArcOfCircle(new GPnt(0, 2, 0), new GPnt(10, 0, 0), new GPnt(5, 5, 0));
  3. var arc2 = SketchBuilder.MakeArcOfCircle(new GPnt(0, 2, 0), new GPnt(-10, 0, 0), new GPnt(-5, 5, 0));
  4. var bottomPt = new GPnt(0, -12, 0);
  5. var line1 = SketchBuilder.MakeLine(new GPnt(-10, 0, 0), bottomPt);
  6. var line2 = SketchBuilder.MakeLine(bottomPt, new GPnt(10, 0, 0));
  7. var shapeList = new TopoShapeList();
  8. shapeList.Add(arc1);
  9. shapeList.Add(arc2);
  10. shapeList.Add(line1);
  11. shapeList.Add(line2);
  12. var wire = SketchBuilder.MakeWire(shapeList);
  13. var face = SketchBuilder.MakePlanarFace(wire);
  14. var shape = FeatureTool.Extrude(face, 5, GP.DZ());
  15. shape = FeatureTool.Fillet(shape, 1);
  16. mView3d.ShowShape(shape, ColorTable.PaleVioletRed);
  17. }

5 总结

本文通过简洁的示例实现了暗黑风格的程序界面,为Ribbon增加Icon图片,并通过WPF的命令路由机制实现了按钮消息处理方法。最后,通过AnyCAD的建模API创建复杂的形状:爱心巧克力。本文所有代码:Valentine's Day

最后,祝天下所有的程序员情人节快乐!

  1. var mesh = FontManager.Instance().CreateMesh("情人节快乐!");
  2. var material = MeshPhongMaterial.Create("love-material");
  3. material.SetColor(ColorTable.OrangeRed);
  4. var shape = new PrimitiveSceneNode(mesh, material);
  5. mView3d.ShowSceneNode(shape);

.NET6: 开发基于WPF的摩登三维工业软件 (2)的更多相关文章

  1. .NET6: 开发基于WPF的摩登三维工业软件 (7)

    做为一个摩登的工业软件,提供可编程的脚本能力是必不可少的能力.脚本既可以方便用户进行二次开发,也对方便对程序进行自动化测试.本文将结合AnyCAD对Python脚本支持的能力和WPF快速开发带脚本编辑 ...

  2. .NET6: 开发基于WPF的摩登三维工业软件

    MS Office和VisualStudio一直引领着桌面应用的时尚潮流,大型的工业软件一般都会紧跟潮流,搭配着Ribbon和DockPanel风格的界面.本文将介绍WPF下两个轻量级的Ribbon和 ...

  3. .NET6: 开发基于WPF的摩登三维工业软件 (8) - MVVM

    基于WPF开发界面的一个很大优势是可以方便地基于MVVM设计模式开发应用.本文从应用的角度基于MVVM实现参数化管材的创建界面. 1 MVVM MVVM是Model-View-ViewModel的简写 ...

  4. .NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人

    基于前文介绍的Ribbon界面.插件化.MVVM模式等内容,我们搭建了一个软件雏形.本文将综合之前的内容在RapidCAX框架中集成Robot组件,实现一个简单的机器人正向模拟模块. 1 目标 基于M ...

  5. 封装:简要介绍自定义开发基于WPF的MVC框架

    原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...

  6. (转)基于 WPF + Modern UI 的 公司OA小助手 开发总结

    原文地址:http://www.cnblogs.com/rainlam163/p/3365181.html 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个 ...

  7. 基于 WPF + Modern UI 的 公司OA小助手 开发总结

    前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会发现自己的不足. 公司每天都要在OA系统上上班点击签到,下班点击签退 ...

  8. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  9. 快速开发基于 HTML5 网络拓扑图应用

    采用 HT 开发网络拓扑图非常容易,例如<入门手册>的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/core/beginners/e ...

随机推荐

  1. centos6.5-搭建LNMP

    安装LNMP 一.安装nginx 1.安装相关组件 yum -y install pcre-devel zlib-devel 2.创建启动用户 useradd -M -s /sbin/nologin ...

  2. linux(CentOS7) 之 MySQL 5.7.30 下载及安装

    一.下载 1.百度搜索mysql,进入官网(或直接进入官网https://www.mysql.com) 2.选择 downloads 3.翻到最下面,选择MySQL Community (GPL) D ...

  3. Shell 里空语句怎么写 - 半角的冒号

    Python 里的空语句写作pass for x in range(10): pass Shell 里的空语句写作 : #!/bin/bash for x in {1..10} do #echo $x ...

  4. Git 如何放弃所有本地修改

    git checkout . #本地所有的修改,没有提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop恢复. git reset ...

  5. uni-app开发的h5,使用微信授权登录(前置条件+具体代码)

    原文 微信内嵌浏览器运行H5版时,可以调起微信登录 普通浏览器调起微信登陆是不开放的,只有个别开发者才有,比如京东 前置条件 在微信内嵌浏览器运行H5版时,调起微信登录,需要配置回调域名 (请注意,这 ...

  6. phar反序列化

    我们一般利用反序列漏洞,一般都是借助unserialize()函数,不过随着人们安全的意识的提高这种漏洞利用越来越来难了,但是在今年8月份的Blackhat2018大会上,来自Secarma的安全研究 ...

  7. Python多环境管理神器(Anaconda)

    为了解决python多版本共存,解决不同版本之间的依赖冲突,虚拟环境隔离等问题,我们前面介绍了venv.virtualenv.virtualenvwrapper.pyenv.pipenv等众多工具.下 ...

  8. JVM完整详解:内存分配+运行原理+回收算法+GC参数等

    不管是BAT面试,还是工作实践中的JVM调优以及参数设置,或者内存溢出检测等,都需要涉及到Java虚拟机的内存模型.内存分配,以及回收算法机制等,这些都是必考.必会技能. JVM内存模型 JVM内存模 ...

  9. dubbo系列十一、dubbo transport层记录

    前言 在dubbo接口方法重载且入参未显式指定序列化id导致ClassCastException分析时候用到了dubbo的通信层和编解码,dubbo有个transport层,默认使用netty4进行网 ...

  10. LSM树以及在hbase中的应用

    转自:http://www.cnblogs.com/yanghuahui/p/3483754.html 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎  是哈希 ...