欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

使用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表示感谢!

 

 

 

5 条消息(共 6 条)
 
 
 

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).

 

原贴地址在此

 

posted @   david96007  阅读(422)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2017-09-28 自动加载简介
点击右上角即可分享
微信分享提示