greatspark 发表于 2025-3-2 11:17:33

停靠面板颜色跟随主题

我们在做一个停靠面板的时候希望其颜色与AutoCAD主题同步,在B站也看过DYH大神的一个演示视频(https://www.bilibili.com/video/BV1Ka4y1P79e/?spm_id_from=333.1387.search.video_card.click),刷他其他视频的时候也看过大致的做法,要新建一个类,实现INotifyPropertyChanged,然后根据AutoCAD不同主题,取面板不同地方的颜色,在程序中设定颜色,不过最终也没有成功,功力还是不够:lol

所以自己一直在找相关的资料,通过查询Managed .NET Reference文档查询到有个类PaletteTheme Class 它的属性有几百个之多,大部分是Color和Brush类型的,猜测这些值应该是跟随AutoCAD主题变化的,遂通过反射读取了各个属性的RGB值,果真如此!!
那么我们再做这个功能的时候就可以通过该类获得颜色,省去了自己取色的麻烦,只需要添加一个监控系统属性的事件,监控COLORTHEME系统值,该值变化了更新相应属性值就可以做到了。
我把所有的属性值都整理出来了,放在下面附件里面了,需要的可以自己下载。

nslove44202489 发表于 2025-3-2 11:55:17

根本没那么复杂啊

greatspark 发表于 2025-3-2 12:02:03

nslove44202489 发表于 2025-3-2 11:55
根本没那么复杂啊

简单的方法能否发一下呢?

gzxl 发表于 2025-3-2 14:29:32

本帖最后由 gzxl 于 2025-3-2 14:30 编辑

c# 不知道,但 mfc 挺简单的。OnPaint
好像从 CAD2006 到 CAD2025 就四种颜色
的确想得太复杂了

你有种再说一遍 发表于 2025-3-2 16:02:45

本帖最后由 你有种再说一遍 于 2025-3-2 16:04 编辑

如果我猜得没错,
系统变量或者环境变量决定主题,
系统变量事件抓一下就好了,
环境变量就看看注册表的用户配置项

主题就几种颜色而已,
把全部颜色存起来就好了吧.
https://www.cnblogs.com/JJBox/p/11610343.html

而WPF切换逻辑,是根据变量进行联动就好了.

nslove44202489 发表于 2025-3-3 17:58:09

greatspark 发表于 2025-3-2 12:02
简单的方法能否发一下呢?

Application.SystemVariableChanged += (s, e) =>
{
   if (e.Name.ToUpper() != "COLORTHEME") return;
   var COLORTHEME = (short)Application.GetSystemVariable("COLORTHEME");
   var blackColor = new SolidColorBrush
   {
         Color = System.Windows.Media.Color.FromArgb(255, 34, 41, 51),
         Opacity = 1
   };
   var whiteColor = new SolidColorBrush
   {
         Color = System.Windows.Media.Color.FromArgb(255, 245, 245, 245),
         Opacity = 1
   };
   启动配置.myUc1.Background = COLORTHEME == 0 ? blackColor : whiteColor;
   //启动配置.myUc1.Foreground = new SolidColorBrush(COLORTHEME == 1 ? Colors.Black : Colors.WhiteSmoke);
   //0   显示深色主题,1   显示浅色主题。
};

greatspark 发表于 2025-3-5 09:38:08

nslove44202489 发表于 2025-3-3 17:58
Application.SystemVariableChanged += (s, e) =>
{
   if (e.Name.ToUpper() != "COLORTHEME") re ...

可能是我没有说明白,我的这个帖子只是提供了颜色的来源,实现的思路应该和你这个方式差不多吧?
不同版本的cad同一个部件的颜色不一致,如果你这样直接设置颜色,难道每个版本做一个程序吗?

箭头_Row 发表于 2025-3-13 23:59:41

greatspark 发表于 2025-3-5 09:38
可能是我没有说明白,我的这个帖子只是提供了颜色的来源,实现的思路应该和你这个方式差不多吧?
不同版 ...
五楼的意見很保貴,將各個版本對應的顏色讀出來做一個字典,獲取一下顏色字典及當前打開的版本,通過監控系統變量的變化來更改主題。

d1742647821 发表于 2025-3-25 11:49:25

nslove44202489 发表于 2025-3-3 17:58
Application.SystemVariableChanged += (s, e) =>
{
   if (e.Name.ToUpper() != "COLORTHEME") re ...

颜色不是这么简单的,一个主题上的颜色大概有几十个,你要怎么通知到你的界面上,还是要用style写一堆DynamicResource
页: [1]
查看完整版本: 停靠面板颜色跟随主题