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);
王磊
您认为此帖子是否有用?欢迎为此帖点赞。
您的问题是否已得到解答?请点击“接受解答”按钮。
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).