Word 加载项拖放到文档上

Posted

技术标签:

【中文标题】Word 加载项拖放到文档上【英文标题】:Word Add-In Drag-Drop onto document 【发布时间】:2014-12-22 20:47:52 【问题描述】:

我正在创建一个 Word 加载项,为了允许将某些内容从自定义任务窗格拖到文档中,我遵循了以下指南: http://msdn.microsoft.com/en-us/library/office/hh780901(v=office.14).aspx

使用这种方法有一些真正的缺点。

首先,捕获 drop 事件的透明 Windows 窗体(或在我的情况下为 WPF)是 Window 的大小,而不是文档的大小,并且 RangeFromPoint 始终返回一个值,即使我们不在文档上方(对于例如,如果我们在功能区上)。因此,一旦您拖动某些内容并创建此表单,无论您拖放到哪里,它都会被放置在文档中。一旦开始,就没有优雅的取消方式。

我的问题是:

有没有人在 Word 加载项中使用拖放操作,并找到比 Microsoft 提供的示例更好的处理方法?

最好使用当前的解决方案,但要知道用户何时没有在文档上拖动或只在文档区域上显示透明窗口。

【问题讨论】:

你得到答案了吗? 【参考方案1】:

希望你已经得到了答案。

我有自己的解决方案。

所以,我的要求

我有一个自定义窗格,其中包含一个列表框,每个项目都是一个普通字符串。当我将列表框中的项目拖到文档中的特定位置时,我想在该位置插入一个合并字段。合并字段的名称是项目的文本。

一开始很简单,然后我遇到了一个问题,就像你在问题中描述的那样。

关于代码

所以,有一个列表框,你需要处理mouseDown和mouseMove,不用担心mouseUp。

在 mouseDown 处理程序中,我记录了边界,如果鼠标移出该边界,将开始拖动。

然后,在 listBox_MouseMoveHandler 中,我检查鼠标的位置以开始拖放。对于DoDragDrop 方法,我必须使用DragDropEffects.Copy

DoDragDrop((sender as ListControl).SelectedValue, DragDropEffects.Copy);

使用该选项,SelectedValue 会被插入到 drop 位置,插入后也会被选中。

然后,我只是检查选择是否不为空,并将所选文本替换为合并字段。当然,我折叠了DoDragDrop之前的选择。这就是全部技巧。

    private int _selectedItemIndex;

    private Rectangle dragBoxFromMouseDown;

    private void CustomizationForListBox(ListBox listBox)
    
        listBox.ItemHeight = 25;
        listBox.DrawMode = DrawMode.OwnerDrawFixed;
        listBox.DrawItem += ListBox_DrawItem;
        listBox.MouseDoubleClick += listBox_MouseDoubleClick;
        listBox.MouseMove += listBox_MouseMoveHandler;
        listBox.MouseUp += listBox_MouseUp;

        listBox.MouseDown += (sender, e) =>
        
            // Handle drag/drop
            if (e.Button == MouseButtons.Left)
            
                _selectedItemIndex = listBox.IndexFromPoint(e.Location);

                // Remember the point where the mouse down occurred. The DragSize indicates
                // the size that the mouse can move before a drag event should be started.                
                Size dragSize = SystemInformation.DragSize;

                // Create a rectangle using the DragSize, with the mouse position being
                // at the center of the rectangle.
                dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
                                                               e.Y - (dragSize.Height / 2)), dragSize);
            
        ;

    

    private void listBox_MouseUp(object sender, MouseEventArgs e)
    
        if (e.Button == MouseButtons.Left)
        
            // Reset the drag rectangle when the mouse button is raised.
            dragBoxFromMouseDown = Rectangle.Empty;
        

    

    private void listBox_MouseMoveHandler(object sender, MouseEventArgs e)
    
        // Handle drag and drop
        // To check if the Mouse left button is clicked
        if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
        
            // If the mouse moves outside the rectangle, start the drag.
            if (dragBoxFromMouseDown != Rectangle.Empty &&
                !dragBoxFromMouseDown.Contains(e.X, e.Y))
            
                // Collapse current selection, now we know nothing is selected
                Globals.ThisAddIn.Application.Selection.Collapse(WdCollapseDirection.wdCollapseEnd);

                //Start Drag Drop
                DoDragDrop((sender as ListControl).SelectedValue, DragDropEffects.Copy);
                if (_selectedItemIndex != -1)
                
                    // If the drag/drop was successful, there dropped text must be selected
                    if (!String.IsNullOrWhiteSpace(Globals.ThisAddIn.Application.Selection.Text))
                    

// Replace the selected text with a merge field MergeFieldHelper.InsertSingleMergeField(mergeFieldInfos[_selectedItemIndex].Name);

【讨论】:

以上是关于Word 加载项拖放到文档上的主要内容,如果未能解决你的问题,请参考以下文章

当助手设置为“克隆”时,我无法通过将列表项拖放到相应选项卡上来移动元素

Word 加载项中的绑定用法

如何为 Word 文档加载项创建 AfterSave 事件

在文档加载时保持 Office 加载项任务窗格打开

Word 加载项功能区

在不安装 Word 的情况下以编程方式使用“Microsoft 另存为 PDF”加载项