使用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有问题。
我不清楚应该怎样修改我的代码,
麻烦指点一下。
谢谢!
下面是我的代码。
// (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的代码:
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).
原贴地址在此