使用RibbonPanelBreak创建Slide-Out Panel遇到的问题
Win7 简体中文版
Autocad civil 3d 2018简体中文版
Visual studio 2015社区版
C#语言
如下图,
使用RibbonPanelBreak分隔,
创建Slide-Out Panel(我不知道这个描述是否准确)。
按钮能够正常创建,
命令也能正常发送。
上图中的按钮“图形清理1”工作一切正常。
问题出在点击Slide-Out Panel部分的按钮时,
例如上图中的“图形清理2”(调用的map 3d的命令mapclean),
对话框弹出后,
如果此时autocad失去焦点,
比如切换到其他程序或者这桌面点击鼠标等,
弹出的对话框会“消失”,
从而造成AutoCAD被卡死。
我注意到AutoCAD自带的Ribbon,
其Slide-Out部分在鼠标点击后,
会慢慢消失,
而我创建的ribbon中的Slide-Out部分在鼠标点击并弹出对话框后,
它一直在那里(如下图),
直到对话框关闭,
最初发现此问题是我自己设计的对话框工作不正常,
以为自己的对话框语有问题,
折腾了很长时间,
后来对其他对话框进行测试,
发现位于Slide-Out部分的按钮弹出的对话框有问题,
才意识到问题不是出在对话框本身,
而是我创建的ribbon有问题。
我不清楚应该怎样修改我的代码,
麻烦指点一下。
谢谢!
下面是我的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | // (C) Copyright 2019 by // using System; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.EditorInput; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Collections; using System.Runtime.CompilerServices; using Autodesk.Civil.DatabaseServices; using Autodesk.Windows; // This line is not mandatory, but improves loading performances //[assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in1.MyCommands))] namespace AutoCAD_CSharp_plug_in1 { // This class is instantiated by AutoCAD for each document when // a command is called by the user the first time in the context // of a given document. In other words, non static data in this class // is implicitly per-document! public class MyCommands { // The CommandMethod attribute can be applied to any public member // function of any public class. // The function should take no arguments and return nothing. // If the method is an intance member then the enclosing class is // intantiated for each document. If the member is a static member then // the enclosing class is NOT intantiated. // // NOTE: CommandMethod has overloads where you can provide helpid and // context menu. /// <summary> /// 2020年9月22日 UserName:Line /// /// </summary> [CommandMethod( "RibbonTest" , "RibbonTest" , "RibbonTest" , CommandFlags.Modal, null , "RibbonTest" , "IDH_RibbonTest" )] public void C_RibbonTest() { RibbonControl ribbon = ComponentManager.Ribbon; if (ribbon != null ) { RibbonTab rtab = ribbon.FindTab( "测试" ); if (rtab != null ) { ribbon.Tabs.Remove(rtab); } rtab = new RibbonTab(); rtab.Title = "测试" ; rtab.Id = "测试ing" ; //Add the Tab ribbon.Tabs.Add(rtab); addContent(rtab); } } private void addContent(RibbonTab rtab) { rtab.Panels.Add(AddOnePanel()); } private RibbonPanel AddOnePanel() { RibbonButton rb; RibbonPanelSource rps = new RibbonPanelSource(); rps.Title = "测试1" ; RibbonPanel rp = new RibbonPanel(); rp.Source = rps; rb = new RibbonButton(); rb.Name = "图形清理1" ; rb.ShowText = true ; rb.Text = "图形清理1" ; rb.CommandHandler= new RibbonbtnCmdHandle(); rb.CommandParameter = "_.MapClean " ; rps.Items.Add(rb); rps.Items.Add( new RibbonPanelBreak()); RibbonRowPanel rrp = new RibbonRowPanel(); rps.Items.Add(rrp); rb = new RibbonButton(); rb.Name = "图形清理2" ; rb.ShowText = true ; rb.Text = "图形清理2" ; rb.CommandHandler = new RibbonbtnCmdHandle(); rb.CommandParameter = "_.MapClean " ; rrp.Items.Add(rb); return rp; } class RibbonbtnCmdHandle : System.Windows.Input.ICommand { public event EventHandler CanExecuteChanged; public bool CanExecute( object parameter) { return true ; } public void Execute( object parameter) { if (parameter is RibbonButton) { RibbonButton rb = parameter as RibbonButton; Application.DocumentManager.MdiActiveDocument.SendStringToExecute( ( string )rb.CommandParameter, true , false , false ); } } } } } |
经过网友edata的测试,
我被搞的更晕了,
感觉问题远比想象的复杂。
增加两个autocad的命令进行测试,
style和insert,
发现style命令没有问题,
对话框弹出后,
滑出面板会消失,
对话框能正常工作,
但insert命令仍存在问题,
对话框弹出后,
滑出面板不消失,
autocad失去焦点后对话框消失,
autocad卡死。
下面是我增加button的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | rrp.Items.Add( new RibbonRowBreak()); rb = new RibbonButton(); rb.Name = "样式" ; rb.ShowText = true ; rb.Text = "样式" ; rb.CommandHandler = new RibbonbtnCmdHandle(); rb.CommandParameter = "_.style " ; rrp.Items.Add(rb); rrp.Items.Add( new RibbonRowBreak()); rb = new RibbonButton(); rb.Name = "插入" ; rb.ShowText = true ; rb.Text = "插入" ; rb.CommandHandler = new RibbonbtnCmdHandle(); rb.CommandParameter = "_.insert " ; rrp.Items.Add(rb); |
补充:
如果把滑出面板钉住,
对话框就不会消失。
网友edata帮我解决了问题,
切换了一下焦点,
问题解决!
在此向edata表示感谢!
You probably already know: for recent versions of AutoCAD (Acad2014, or 2015 and later), You can simply call
Application.MainWindow.Focus()
instead of Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView() (I guess Autodesk just added this functionality from Internal namespace to Application class).
原贴地址在此
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-09-28 自动加载简介